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

时间:2012-12-13 19:45:25

标签: python windows windows-installer distutils cx-freeze

我经常使用cx_freeze将我的python源包装为所有依赖项,然后通过distutils bdist_msi扩展名

创建一个msi安装包

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

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

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

2 个答案:

答案 0 :(得分:8)

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

  

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

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

options = {"bdist_msi": {"upgrade-code":"..."}}

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

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

答案 1 :(得分:5)

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

bdist_msi_options = {
    "upgrade_code": "{96a85bac-52af-4019-9e94-3afcc9e1ad0c}"
    }

并且这些选项需要与“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')])

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