Кто знает, как можно реализовать автообновление в скрипте (python)? Я получал файлы из github репозитория, но работает криво( Спойлер def check_for_updates(): """Проверяет наличие новой версии программы.""" try: response = requests.get(VERSION_URL, timeout=10) response.raise_for_status() latest_version = response.text.strip() if latest_version != CURRENT_VERSION: print(f"Доступна новая версия: {latest_version}. Текущая версия: {CURRENT_VERSION}.") return True, latest_version else: print("* Вы используете последнюю версию программы.") return False, None except requests.RequestException as e: print(f"Ошибка при проверке обновлений: {e}") return False, None def download_new_version(): """Скачивает новую версию программы.""" try: response = requests.get(UPDATE_URL, stream=True, timeout=30) response.raise_for_status() # Сохраняем новую версию программы во временный файл with open("client_new.exe", "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print("Новая версия программы успешно скачана.") return True except requests.RequestException as e: print(f"Ошибка при скачивании новой версии: {e}") return False def replace_with_new_version(): """Заменяет текущий файл программы на новую версию и перезапускает её.""" try: current_file = sys.argv[0] temp_file = current_file + ".new" # Перемещаем скачанный файл в временный файл shutil.move("client_new.exe", temp_file) # Создаём .bat файл для обновления bat_file = os.path.join(os.path.dirname(current_file), "update.bat") with open(bat_file, "w") as f: f.write(f"Echo off\n") f.write(f"timeout /t 2 > nul\n") # Ждём 2 секунды f.write(f"move /y \"{temp_file}\" \"{current_file}\"\n") # Заменяем файл f.write(f"start \"\" \"{current_file}\"\n") # Перезапускаем программу f.write(f"del \"%~f0\"\n") # Удаляем .bat файл print(f"Файл {bat_file} успешно создан.") # Запускаем .bat файл и завершаем текущий процесс os.system(f"start {bat_file}") sys.exit(0) except Exception as e: print(f"Ошибка при обновлении программы: {e}")
ну твой подход выглядит в целом верным, однако подозреваю что виндовс дефендеру могут не понравится такие фокусы с бат файлами
вот я когда то подобное писал, там немного лишнего кода для тебя, но в целом работало хорошо код def updateApplication(self, download_url): old_file = argv[0] old_dir = os.path.dirname(old_file) pid = ctypes.windll.kernel32.GetCurrentProcessId() error = False progress_dialog = QProgressDialog(self.translations.get("update_load", ""), None, 0, 100) progress_dialog.setWindowTitle(self.translations.get("update", "")) progress_dialog.setWindowModality(2) progress_dialog.show() try: response = get(download_url, stream=True) total_size_in_bytes = int(response.headers.get('content-length', 0)) block_size = 1024 downloaded_bytes = 0 with open(f'{old_dir}/Stellaris-DLC-Unlocker.load', 'wb') as new_exe: for data in response.iter_content(block_size): new_exe.write(data) downloaded_bytes += len(data) progress = int(downloaded_bytes / total_size_in_bytes * 100) progress_dialog.setValue(progress) with open('updater.bat', 'w') as updater_file: updater_file.write('chcp 1251 > nul\n') updater_file.write('@echo off\n') updater_file.write(f'taskkill /pid {pid} /f\n') updater_file.write(f'ping 127.0.0.1 -n 3 > nul\n') updater_file.write('echo Updating...\n') updater_file.write(f'del "{old_file}"\n') updater_file.write(f'rename "{old_dir}\\file.load" "file.exe"\n') updater_file.write(f'start "" "{old_dir}\\file.exe"\n') updater_file.write('ping 127.0.0.1 -n 2 > nul\n') updater_file.write('del %0') except Exception: if self.ok_dialog(self.translations.get("error", ""), self.translations.get("update_error", ""), QMessageBox.Critical): pass error = True progress_dialog.close() if not error: sleep(0.5) Popen(['cmd.exe', '/c', 'updater.bat'], shell=True) exit() Python def updateApplication(self, download_url): old_file = argv[0] old_dir = os.path.dirname(old_file) pid = ctypes.windll.kernel32.GetCurrentProcessId() error = False progress_dialog = QProgressDialog(self.translations.get("update_load", ""), None, 0, 100) progress_dialog.setWindowTitle(self.translations.get("update", "")) progress_dialog.setWindowModality(2) progress_dialog.show() try: response = get(download_url, stream=True) total_size_in_bytes = int(response.headers.get('content-length', 0)) block_size = 1024 downloaded_bytes = 0 with open(f'{old_dir}/Stellaris-DLC-Unlocker.load', 'wb') as new_exe: for data in response.iter_content(block_size): new_exe.write(data) downloaded_bytes += len(data) progress = int(downloaded_bytes / total_size_in_bytes * 100) progress_dialog.setValue(progress) with open('updater.bat', 'w') as updater_file: updater_file.write('chcp 1251 > nul\n') updater_file.write('@echo off\n') updater_file.write(f'taskkill /pid {pid} /f\n') updater_file.write(f'ping 127.0.0.1 -n 3 > nul\n') updater_file.write('echo Updating...\n') updater_file.write(f'del "{old_file}"\n') updater_file.write(f'rename "{old_dir}\\file.load" "file.exe"\n') updater_file.write(f'start "" "{old_dir}\\file.exe"\n') updater_file.write('ping 127.0.0.1 -n 2 > nul\n') updater_file.write('del %0') except Exception: if self.ok_dialog(self.translations.get("error", ""), self.translations.get("update_error", ""), QMessageBox.Critical): pass error = True progress_dialog.close() if not error: sleep(0.5) Popen(['cmd.exe', '/c', 'updater.bat'], shell=True) exit()