簡體   English   中英

卸載通過cx_freeze bdist_msi創建的先前已安裝的msi

[英]Uninstall a previous Installed msi created through cx_freeze bdist_msi

我經常使用cx_freeze來封裝我的python源代碼並使用所有依賴項,然后通過distutils bdist_msi擴展創建一個msi安裝包

當我嘗試重新安裝新創建的msi Windows安裝程序而不卸載以前的版本時,會出現唯一的問題。 卸載程序會記錄以前卸載的所有軟件版本,並顯示注冊表和卸載程序信息。

是否可以檢測以前安裝的軟件版本並自動卸載而無需安裝新版本?

我知道NSIS ,以及它的python綁定如何創建安裝程序,我提到的上述問題可以通過它輕松解決。 不幸的是,在這個時刻,我沒有看到Python提供的任何東西,即distutils。

在cx_Freeze中, bdist_msi有一個選項upgrade-code文檔描述為:

定義創建的包的升級代碼; 這用於在安裝此升級代碼之前強制刪除使用相同升級代碼創建的任何包

要指定它,我認為你必須將它傳遞給setup()調用,如下所示:

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

(我總是忘記它是否應該-_在選項名稱中使用它們,所以如果這是錯誤的,請嘗試將其作為upgrade_code

微軟稱升級代碼應該是GUID(隨機生成的代碼)。

托馬斯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')])

使用此代碼,在我的情況下,以前的安裝程序已正確卸載並從添加/刪除程序列表中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM