我有一个python程序,然后我用cx_freeze编译,通过下载zip文件然后覆盖文件来更新自己。事实上,每当我执行它时,都会发生这种情况:
Traceback (most recent call last):
File ".\updater.py", line 69, in empezar_actualizacion
self.bajar_archivos()
File ".\updater.py", line 75, in bajar_archivos
self.extraer_archivos()
File ".\updater.py", line 80, in extraer_archivos
self.descarga.descomprimir(self.archivos)
File "utils.py", line 167, in descomprimir
raise(e)
IOError: [Errno 13] Permission denied: '_ctypes.pyd'
以下是提取文件的代码:
class DescargaThread(threading.Thread):
def __init__(self):
self.url = config['servidor_de_actualizacion']
def descargar_actualizacion(self):
version = obtener_version()
if not version:
return 'Problemas de conexión, inténtelo después.'
try:
nueva_version = urllib.urlopen(self.url).read()
return nueva_version
except Exception as e:
raise(e)
def descomprimir(self, archivo):
try:
zip_file = zipfile.ZipFile(StringIO(archivo))
for f in zip_file.namelist():
self.file_unzipped = zip_file.extract(f)
return True
except Exception as e:
raise(e)
如何让文件覆盖自己?要求更高的权限?
答案 0 :(得分:0)
是的,我会使用chmod
要求更高的权限。如果您打算编写新文件,我还会要求您将这些文件下载到父目录的更高权限。
答案 1 :(得分:0)
当我在Python中部署Windows应用程序时,我使用cx_freeze然后将其与Inno Setup一起打包。然后,用户可以轻松地下载并安装应用程序。
应用程序在启动时检查Web服务器是否有更新。找到新版本后,它会询问用户是否要更新。如果是,则应用程序下载新安装程序。您可以显示一些进度条,以便为用户提供良好的反馈。
完成后,它会根据存储库中提供的MD5或SHA1哈希检查下载的安装程序,启动安装程序并以与此类似的方式关闭应用程序:
data = open(installer_path, "rb").read()
sha = hashlib.sha1(data).hexdigest()
if sha != shaWeb:
blocking_message_box("Installer is corrupted.")
else:
blocking_message_box("Installer is correct, will be installed now.")
subprocess.Popen('"' + installer_path + '"', shell=True)
this_application.Close()
用户现在进行安装。因为它之前已经安装过,我认为Inno安装程序将显示之前使用的相同目录,因此工作量类似于Next
,Next
,Finish
。您可以设置安装程序,以便保留用户设置等。您可以以静默方式运行安装程序,但许多用户讨厌应用程序在他们背后做某事时。
您还可以为已安装该应用程序的用户创建类似更新的安装程序,跳过DLL和其他共享文件,仅更新*.exe
和library.zip
。因为我的应用程序通常只有一个,所以无论如何我使用以下方法将library.zip
嵌入到可执行文件中:
options = {"build_exe": {"build_exe": "../Bin",
"create_shared_zip": False,
}}