Реализация Updater для настольного приложения, написанного на Python.Python

Программы на Python
Ответить
Anonymous
 Реализация Updater для настольного приложения, написанного на Python.

Сообщение Anonymous »

У меня есть настольное приложение, написанное на Python с использованием PyQt. Он установлен в Windows 10 и более поздних версиях. Я создаю пакет сборки с помощью cx-Freeze и установщик с помощью Inno Setup. Я не хочу использовать инструмент Advanced Installer, поскольку он дорогостоящий, поэтому я собираюсь выполнить все шаги вручную.
Я написал средство обновления вручную, которое проверяет наличие новых версий и загрузок. последний исполняемый файл с облачного сервера. Однако он не работает на компьютерах пользователей — из-за прав администратора, хотя на моем ПК работает. Не могли бы вы рассказать мне обо всех нюансах, которые мне следует учитывать при создании надежного автоматического средства обновления для моего настольного приложения? Вот код, который я написал для загрузки .exe-файла из облака и его запуска.
def start_update(self):
self.ok_button.setEnabled(False)
threading.Thread(target=self.update_process).start()

def update_process(self):
bucket_name = 'doccyversionbucket2'
key = 'updated_version/doccy_transparent.exe'
local_installer_path = os.path.join(os.path.expanduser('~'), 'Downloads', 'DoccyInstaller.exe')

if self.download_update(bucket_name, key, local_installer_path):
if not self.run_as_admin(local_installer_path):
logger.error("Failed to install the update")
self.update_check_signal.emit(False)
else:
logger.error("Failed to download the update")
self.update_check_signal.emit(False)

def download_update(self, bucket_name, key, save_path):
try:
s3 = session.client('s3')
logger.info(f"Attempting to download update from s3://{bucket_name}/{key} to {save_path}")
s3.download_file(bucket_name, key, save_path)
logger.info("Download completed successfully")
return True
except Exception as e:
logger.error(f"Error downloading update: {e}")
return False

def run_as_admin(self, installer_path):
try:
if self.is_admin():
subprocess.run([installer_path], check=True)
return True
else:
result = ctypes.windll.shell32.ShellExecuteW(None, "runas", installer_path, None, None, 1)
return result > 32
except Exception as e:
logger.error(f"Error running as admin: {e}")
return False

def is_admin(self):
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False


Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»