2012-12-13 119 views
4

我經常使用cx_freeze來包裝我的Python源與所有的依賴關係,並隨後通過distutilsbdist_msi擴展創建MSI安裝包卸載以前安裝的MSI通過cx_freeze創建bdist_msi

唯一的問題發生在我嘗試重新安裝一個新創建的msi windows安裝程序,無需卸載以前的版本。卸載程序會記錄所有以前卸載的軟件版本,並且會記錄註冊表和卸載程序信息。

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

我知道NSIS,以及如何用它的python綁定來創建安裝程序,我提到的上述問題可以很容易地通過它來解決。不幸的是,在這一刻,我沒有看到任何超出Python提供的東西,即distutils。

回答

6

在cx_Freeze,bdist_msi有一個選項upgrade-code,其the docs作爲描述:

定義所創建的包升級代碼;這是用來 強制刪除以相同的升級代碼創建的軟件包的安裝這一個

之前 要指定它,我想你可以把它傳遞給setup()電話這樣的事情:

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

(我總是忘了是否應該在選項名稱-_使用它們這個樣子,所以如果這是錯的,嘗試爲upgrade_code

Microsoft say升級代碼應該是一個GUID(隨機生成的代碼)。

+1

** + 1 **好答案。有關修復Windows卸載錯誤的附註:打開路徑C:\ Windows \ assembly,然後按下公共密鑰令牌*列標題*按順序排序。然後查找***您的MSI公共令牌***號碼(* MSI安裝的**不**刪除*)並刪除這些令牌條目。在錯誤的卸載後執行此操作將允許正確的重新安裝/升級,更少的污點註冊表和卸載程序信息。乾杯! * P.S。這是如何解決ATi Catalyst驅動程序和CCC面板更新出錯的問題。* – arttronics

+0

好的答案的確如此。奇怪的是,我也嘗試過使用升級代碼,但對於如何使用它卻一無所知。現在您可以參考MS網站,聲明它應該是一個隨機的GUID。我將在今天早上做的第一件事,並更新它如何展示。 – Abhijit

+0

我看了鏈接並做了這個,但是我不能做安裝,刪除舊的,並安裝新的。這是我的'setup.py' http://codepaste.net/fkzojh,你能解釋更多,我該如何改變產品或包裝ID在舊包裝上安裝不是新的? – alireza

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')]) 

有了這個代碼,在我的情況下,以前的安裝程序進行正確卸載,並從添加刪除/刪除程序列表。