簡體   English   中英

在Windows上使用內置Python構建軟件安裝程序

[英]Building software installer with built-in python on Windows

我們的命令行實用程序是使用Python編寫的。

在Linux / OS X上,這通常不是問題,因為兩者都預裝了Python2.x。 但是,在Windows上,默認情況下未安裝Python。

另一個問題是,我們的依賴項很少需要編譯,對於Windows用戶而言,這又不是小問題,因為它需要修補MSVC / Cygwin / etc。

到目前為止,我們通過使用Pyinstaller創建具有預先安裝的依賴項的“凍結” Python程序包來解決此問題。 這很好用,但是使我們的實用程序不可擴展-我們不能通過使用諸如pip實用程序來添加其他Python模塊。 由於我們的CLI依賴於此功能來增加其他可用性,因此此限制對我們來說是一個障礙,因此我們想重新考慮我們的方法。

到處搜尋,我發現Rhodecode如何解決這個問題 基本上,他們的安裝程序會帶來Python和其他所有功能(包括預編譯的依賴項)。

這對我們來說是個好主意,我在這里看到的唯一限制是他們的安裝程序實際上是從.msi安裝Python的,從而將內容放入Windows注冊表。 因此,在Windows上只能安裝一個XY版本的Python(來自.msi

對於服務器應用程序來說,這可能是合理的,因為服務器應用程序的行為就像是PC上唯一安裝的那樣,但是對於命令行實用程序來說,這是完全不可接受的。

環顧四周,我發現很少有聲稱使Python可移植的項目,例如Portable Python 但是我不確定它到底有多“便攜”,尤其是在出現此類問題之后。

所以問題是:

  1. 是否可以在Windows上多次安裝相同的Python版本而不會在實例之間造成沖突?

  2. 您是否會選擇其他解決方法來解決此問題(請不要使用“智能”解決方案,例如:放棄Windows支持/不使用Python)

謝謝!

坦白說,我會堅持使用PyInstaller或類似的東西。 無論目標計算機是否安裝了Python,這都將始終為您提供正確的Python版本。 它還可以保護您避免破壞以前安裝的Python版本。

如果您需要添加插件,則應將其內置到您的應用中。 有一些項目可能會幫助您。 以下是幾個示例:

您可能還會看看Django或Flask如何處理擴展。 例如,您可以向Flask添加擴展名以使其可以與SQLAlchemy一起使用 您應該能夠對自己的應用程序執行類似的操作。 pip實用程序畢竟不能與凍結的應用程序一起使用。 另外,您看過conda嗎? 它可能適合您的目的。

這是我第二個問題的答案,可悲的是我仍然沒有找到更好的方法來解決數字1。

現在,這是我們如何更改創建安裝文件的方法:

  1. 我們將代碼及其依賴項打包為一組預構建的Python輪子。 自從發布適用於Python2.7Visual C ++編譯器以來,在Windows上創建預先構建的輪子相對容易。
  2. 我們將Python設置MSI以及Pip,Setuptools和Virtualenv滾輪打包在一起。
  3. 在開始安裝之前,我們檢查是否已經安裝了Python,Pip和Virtualenv(通過在注冊表和\\ Scripts中查找),如果尚未安裝,則從打包的輪子安裝。 通過使用我們還捆綁的get-pip.py腳本來安裝Pip wheel。
  4. 我們創建單獨的Virtualenv並將車輪安裝到其中。
  5. 卸載是通過刪除virtualenv文件夾完成的。 剩下的是Python,Pip和Virtualenv安裝。

由Inno Setup創建的安裝程序。

我仍然對這個解決方案不完全滿意,因為某些組件已全局安裝,並且可能與用戶之前已經安裝的組件(python / pip,setuptools或virtualenv的舊/新版本)發生沖突。 這會在安裝或運行時產生潛在的錯誤。 或者用戶將來可以升級其中一個組件並以某種方式破壞應用程序的可能性。

另外,卸載很臟,會留下東西。

暫無
暫無

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

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