覆盖文件的权限

时间:2014-09-09 13:13:29

标签: python zip updates cx-freeze

我有一个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)

如何让文件覆盖自己?要求更高的权限?

2 个答案:

答案 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安装程序将显示之前使用的相同目录,因此工作量类似于NextNextFinish。您可以设置安装程序,以便保留用户设置等。您可以以静默方式运行安装程序,但许多用户讨厌应用程序在他们背后做某事时。

您还可以为已安装该应用程序的用户创建类似更新的安装程序,跳过DLL和其他共享文件,仅更新*.exelibrary.zip。因为我的应用程序通常只有一个,所以无论如何我使用以下方法将library.zip嵌入到可执行文件中:

options = {"build_exe": {"build_exe": "../Bin",
                          "create_shared_zip": False,
                         }}