卸载通过cx_freeze bdist_msi创建的先前已安装的msi

Abh*_*jit 4 python windows windows-installer distutils cx-freeze

我经常使用cx_freeze来包装我的python源代码并使用所有依赖项,然后通过distutils bdist_msi扩展创建一个msi安装包

当我尝试重新安装新创建的msi Windows安装程序而不卸载以前的版本时,会出现唯一的问题.卸载程序会记录以前卸载的所有软件版本,并显示注册表和卸载程序信息.

是否可以检测以前安装的软件版本并自动卸载而无需安装新版本?

我知道NSIS,以及它的python绑定如何创建安装程序,我提到的上述问题可以通过它轻松解决.不幸的是,在这个时刻,我没有看到Python提供的任何东西,即distutils.

Tho*_*s K 8

在cx_Freeze中,bdist_msi有一个选项upgrade-code,文档描述为:

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

要指定它,我认为你必须将它传递给这样的setup()调用:

options = {"bdist_msi": {"upgrade-code":"..."}}
Run Code Online (Sandbox Code Playgroud)

(我总是忘记是否应该-或者_在选项名称中使用它们,所以如果这是错误的,请尝试它upgrade_code)

微软称升级代码应该是GUID(随机生成的代码).


rdc*_*ers 5

托马斯K的答案很接近,但至少在我的情况下,并不确切.经过一些试验和错误后,我发现GU​​ID需要用大括号括起来:

bdist_msi_options = {
    "upgrade_code": "{96a85bac-52af-4019-9e94-3afcc9e1ad0c}"
    }
Run Code Online (Sandbox Code Playgroud)

并且这些选项需要与"build_exe"选项一起传递(一些在线示例使用其他名称作为这些参数,但我发现只有bdist_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')])
Run Code Online (Sandbox Code Playgroud)

使用此代码,在我的情况下,以前的安装程序已正确卸载并从添加/删除程序列表中删除.