Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 卸载以前安装的通过cx_freeze bdist_msi创建的msi_Python_Windows_Windows Installer_Distutils_Cx Freeze - Fatal编程技术网

Python 卸载以前安装的通过cx_freeze bdist_msi创建的msi

Python 卸载以前安装的通过cx_freeze bdist_msi创建的msi,python,windows,windows-installer,distutils,cx-freeze,Python,Windows,Windows Installer,Distutils,Cx Freeze,我经常使用将python源代码与所有依赖项打包,然后通过扩展创建msi安装包 唯一的问题发生在我尝试重新安装新创建的msi windows安装程序而不卸载以前的版本时。卸载程序保留以前卸载的所有软件版本的记录,并记录注册表和卸载程序信息 是否可以检测以前安装的软件版本并在不安装新版本的情况下自动卸载 我知道,通过它的python绑定来创建安装程序,我提到的上述问题可以很容易地通过它来解决。不幸的是,此时此刻,我所看到的并不是Python提供的任何东西,即distutils。在cx\u Freez

我经常使用将python源代码与所有依赖项打包,然后通过扩展创建msi安装包

唯一的问题发生在我尝试重新安装新创建的msi windows安装程序而不卸载以前的版本时。卸载程序保留以前卸载的所有软件版本的记录,并记录注册表和卸载程序信息

是否可以检测以前安装的软件版本并在不安装新版本的情况下自动卸载


我知道,通过它的python绑定来创建安装程序,我提到的上述问题可以很容易地通过它来解决。不幸的是,此时此刻,我所看到的并不是Python提供的任何东西,即distutils。

在cx\u Freeze中,
bdist\u msi
有一个选项
升级代码
,该选项描述为:

定义所创建包的升级代码;这是用来 强制删除使用相同升级代码创建的任何包 在安装这个之前

要指定它,我认为您必须将其传递给
setup()
调用如下内容:

options = {"bdist_msi": {"upgrade-code":"..."}}
(我总是忘记在选项名称中是
-
还是
\uu
这样使用它们,因此如果这是错误的,请尝试将其作为
升级\ucode


升级代码应该是一个GUID(一个随机生成的代码)。

Thomas K的答案很接近,但至少在我的情况下,不准确。经过反复试验,我发现GUID需要用花括号括起来:

bdist_msi_options = {
    "upgrade_code": "{96a85bac-52af-4019-9e94-3afcc9e1ad0c}"
    }
这些选项需要与“build_exe”选项一起传递(一些在线示例使用这些参数的其他名称,但我发现只有bdist_msi起作用):


在我的例子中,使用这段代码,以前的安装程序被正确卸载并从添加/删除程序列表中删除

+1个好答案。关于修复Windows卸载出错的旁注:打开路径
C:\Windows\assembly
,然后按
公钥令牌
列标题按顺序排序。然后查找您的MSI公共令牌号(未删除的MSI安装的令牌号)并删除这些令牌项。在错误的卸载后执行此操作将允许正确的重新安装/升级,减少错误的注册表和卸载程序信息。干杯附:这是如何修复ATi Catalyst驱动程序和CCC面板更新出错的问题。答案确实不错。奇怪的是,我以前也尝试过升级代码,但不知道如何使用它。现在,您可以参考MS网站,说明它应该是一个随机GUID。我会在早上的第一件事,更新它是如何公平的。我读了链接,并这样做了,但我不能使安装删除旧的和安装新的。这是我的
setup.py
,你能解释更多,如何更改产品或软件包id以安装在旧软件包而不是新软件包上?@alireza.m:the
只是一个占位符。您应该生成一个随机GUID以放入其中。即使如此,如果以前的版本具有相同的GUID,它也只会替换以前的版本,因此您不能使用它来删除在您想到这一点之前已经存在的版本。@ThomasK感谢您的回答,但是如果存在旧版本,有没有办法创建MSI包,用新版本替换旧版本?
setup(  # name, version, description, etc...
        options={"build_exe": build_exe_options, # defined elsewhere
                 "bdist_msi": bdist_msi_options},
        executables=[Executable("run.py",
                                base="win32GUI",
                                shortcutName="My Program name",
                                shortcutDir='ProgramMenuFolder')])