我经常使用cx_freeze将我的python源包装为所有依赖项,然后通过distutils bdist_msi扩展名
创建一个msi安装包当我尝试在不卸载以前版本的情况下重新安装新创建的msi Windows安装程序时,会出现唯一的问题。卸载程序会记录以前卸载的所有软件版本,并显示注册表和卸载程序信息。
是否可以检测以前安装的软件版本并自动卸载而无需安装新版本?
我知道NSIS,以及它的python绑定如何创建安装程序,我提到的上述问题可以通过它轻松解决。不幸的是,此时此刻,我并没有看到Python提供的任何内容,即distutils。
答案 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的回答很接近,但至少在我的情况下,并不准确。经过一些试验和错误后,我发现GUID需要用大括号括起来:
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')])
使用此代码,在我的情况下,以前的安装程序已正确卸载并从添加/删除程序列表中删除。