卸载以前通过 cx_freeze bdist_msi 创建的已安装 msi
Posted
技术标签:
【中文标题】卸载以前通过 cx_freeze bdist_msi 创建的已安装 msi【英文标题】:Uninstall a previous Installed msi created through cx_freeze bdist_msi 【发布时间】:2012-12-13 19:45:25 【问题描述】:我经常使用cx_freeze来打包我的python源和所有依赖项,然后通过distutilsbdist_msi扩展创建一个msi安装包
当我尝试重新安装新创建的 msi Windows 安装程序而不卸载以前的版本时,会出现唯一的问题。卸载程序会记录所有以前卸载的软件版本,并记录注册表和卸载程序信息。
是否可以检测到我以前安装的软件版本并自动卸载它而不安装新版本?
我知道NSIS,以及如何使用它的python 绑定来创建安装程序,我提到的上述问题可以通过它轻松解决。不幸的是,目前,我没有看到 Python 提供的任何东西,即 distutils。
【问题讨论】:
【参考方案1】:在 cx_Freeze 中,bdist_msi
有一个选项 upgrade-code
,the docs 描述为:
为创建的包定义升级代码;这是使用的 强制删除使用相同升级代码创建的任何包 在安装这个之前
要指定它,我认为您必须将其传递给 setup()
调用,如下所示:
options = "bdist_msi": "upgrade-code":"..."
(我总是忘记在选项名称中应该是-
还是_
这样使用它们,所以如果这是错误的,请尝试使用upgrade_code
)
Microsoft say 表示升级代码应该是 GUID(随机生成的代码)。
【讨论】:
+1 很好的答案。关于修复 Windows 卸载出错的附注:打开路径C:\Windows\assembly
并按 Public Key Token
列标题 以按顺序排序。然后查找 您的 MSI 公共令牌 编号(未删除的 MSI 安装编号)并删除那些令牌条目。在错误卸载后执行此操作将允许正确重新安装/升级,减少注册表和卸载程序信息的污点。干杯! 附言这是修复 ATi Catalyst 驱动程序和 CCC 面板更新出错的方法。
确实是很好的答案。奇怪的是,我之前也尝试过升级代码,但不知道如何使用它。现在,您对 MS 网站的引用说明它应该是一个随机的 GUID 是有道理的。我将在早上的第一件事,并更新它是如何公平的。
我阅读了链接并执行了此操作,但我无法进行删除旧的安装并安装新的安装。这是我的setup.py
codepaste.net/fkzojh,你能解释更多,我该如何更换产品或用于安装在旧包而不是新包上的包 ID?
@alireza.m :...
只是一个占位符。您应该生成一个随机 GUID 并放入其中。即使那样,它也只会在具有相同 GUID 的情况下替换以前的版本,因此您不能使用它来删除在您想到这一点之前已经存在的版本。
@ThomasK 感谢您的回答,但是如果有旧版本,有没有办法创建用新版本替换旧版本的 MSI 包?【参考方案2】:
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')])
使用此代码,在我的情况下,以前的安装程序已正确卸载并从添加/删除程序列表中删除。
【讨论】:
以上是关于卸载以前通过 cx_freeze bdist_msi 创建的已安装 msi的主要内容,如果未能解决你的问题,请参考以下文章
CX_freeze 可执行文件将不起作用。 _tkinter DLL 加载失败