2017-02-26 62 views
20

在過去的幾年裏,我用python編寫了一個很好的小程序,現在我想分發它,但是我的第一次嘗試沒有遇到太多的熱情,因爲許多潛在的用戶不喜歡下載和安裝python以及運行我的應用程序所需的所有依賴關係的想法。凍結每個操作系統的python腳本

我環顧四周尋找一種解決方案,將代碼編譯成易於運行的東西,但我對所發現的內容並不滿意。

我對凍結應用程序而不真正編譯它的想法沒有任何問題。這只是意味着最終用戶將等待幾秒鐘來下載應用程序,並在他/她的硬盤上佔用更多空間。

我的問題是找到一種方法來將所有應用程序打包到每個操作系統的可執行文件中(比如說,Windows,Mac,Linux--對於每個操作系統顯然是不同的可執行文件),而無需安裝虛擬機或葡萄酒或類似的選項。我強烈懷疑這是可能的,因爲我看到一堆ren'py遊戲打包完全符合我想打包應用程序的方式,但是我不知道如何獲得與我的程序相同的結果。

示意圖中,我的應用程序需要一個控制檯才能運行,幷包含一些自制包,numpy和matplotlib。它也有一個系統支持多種語言,動態地包括一個語言文件,覆蓋以前的設置:

exec('from lang.%s import lang' % language) 

我懷疑這可能會產生一些問題。最後,該程序需要幾個文件夾來保存其設置,日誌等在第一次運行,所以這些也應該包括在內。我的電腦運行ubuntu mate 16.10(x64),python版本是2.7,但是將來我打算將它翻譯成python 3.所創建的可執行文件可以是單個重文件,其中包含幾乎所有需要的文件或輕量文件,其他所有文件都可以在附近的文件夾中找到;我沒有對一種解決方案或其他解決方案的偏好。

我知道這個問題不時出現,可能已經回答了,但這種問題的最後一次發現可以追溯到2014年,如果我們考慮如何快速地在這個領域的變化。

編輯:既然有似乎是我提出的,我能想到的設置了一些仿真器/包裝/兼容層/不管運行冷凍不同操作系統的條件沒有解決辦法,但我不知道該怎麼辦。我在這裏和那裏看到,葡萄酒並不總是正常工作,並找不到任何東西在Linux上爲Mac編譯。據我瞭解,程序不需要32/64位系統的不同編譯,但是如果有一種簡單的方法來編譯每種可能性,它都會很好。虛擬機仍然不行,現在我的磁盤上沒有空間來建立兩個或兩個以上的虛擬機(這是ssd磁盤的巨大缺點......),更不用說支付操作系統許可證了每年使用幾次來編譯一個免費軟件。

+1

打包您的程序所需的所有文件/文件夾應該不成問題,大多數工具都支持該功能。我認爲最大的障礙是交叉編譯 - 據我所知,只能爲您當前使用的平臺生成可執行文件,因此您必須在Windows上凍結以獲取Windows .exe並凍結到Linux得到一個linux可執行文件等 –

+0

@Rawing如果我理解正確,ren'py似乎交叉編譯python沒有任何問題。我沒有可能爲每種可能的環境運行虛擬機,所以如果有另一種解決方案,它會很棒。 – GRB

+0

如果您真的堅持不擁有虛擬機,您可以使用持續集成服務在各種操作系統中運行您的打包程序。 –

回答

5

由於我沒有看到它在這裏,但我想我會帶來Docker。它似乎是一個可分發的虛擬機,它包含某種軟件包或應用程序。 github上有免費的社區版本https://github.com/docker/docker。我從來沒有用過它,但它似乎符合你的所有標準 - 輕量級,免費和平臺不可知論。只是要探索。

+0

我正在研究這個,它看起來很有前途。有很多選項我必須檢查,但現在我有一種感覺,這是我需要的。 – GRB

+0

是的,它看起來相當廣泛,但我很高興聽到你發現它很有用。我將不得不周到瞭解更多關於這些日子中的一個。我的鄰居是一位IT顧問,他表示他最近的大部分工作都是將其整合到各個公司作爲其軟件開發的新平臺。無論如何,祝你好運。 –

+2

Docker是另一種選擇,但請記住它需要用戶安裝docker運行時才能使用您構建的容器。既然你已經說過你不想讓用戶安裝任何東西,它可能不適合你。 – danny

7

夫婦的事情第一。

  • Python是已經跨平臺
  • Python代碼解釋,而不是一個本地編譯語言,不需要編譯
  • 存在着在Python setuptools標準方法來分發跨平臺兼容性
  • 可執行的腳本
  • 第三方python庫可以包括本地代碼(在C中),這些代碼可能需要在安裝時進行編譯或者對於程序包維護人員可用的二進制包。 NumPy和matplotlib都屬於這個類別,並且確實有可用於Windows AFAIK的二進制包。

下面是一些例子setup.py代碼安裝可執行腳本:

from setuptools import setup, find_packages 
setup(<...>, 
     entry_points={'console_scripts': [ 
      '<console cmd name here> = my_package.module:main' 
]}) 

my_package.module例如

my_package/module.py

<..> 
def main(): 
    <what to run when <console cmd name here> is executed> 

封裝然後可以分佈式作爲標準的Python模塊,可以通過安裝3210。如果代碼是開源的,它可以託管在PyPi上(請參閱PyPi網站上有關如何安裝的說明)。

否則,可以構建一個源代碼或二進制輪包(分別爲python setup.py sdistpython setup.py bdist_wheel)並將其發佈給您的用戶。

二進制輪將需要建立在他們將要安裝的平臺上,源代碼發行版可以在任何平臺上運行,但需要代碼在安裝時執行,因爲它們包含純粹的源代碼。

請注意,建築/安裝二進制輪組件需要pip版本> = 6.0setuptools> = 26.0

安裝此軟件包時,將在此處提供一個<控制檯cmd名稱>可執行文件,以便在可以成功安裝軟件包的所有平臺上運行。

對於一個簡單的示例包,請參閱hello-world-python-package,特別是其setup.py

查看pythonwheels site瞭解二進制輪組的更多信息。

+0

感謝您的回答,但這不是我要找的。我試圖分發一個獨立的程序,而不是可以包含在其他程序中的python模塊。我的問題是,現在我的程序需要最終用戶安裝python,numpy和matplotlib才能運行,要求阻止最終用戶,特別是Windows用戶。這就是爲什麼我試圖「編譯」,或更正確地凍結我的代碼。 – GRB

+0

最常用的Python實現(來自python.org,通常被稱爲CPython)*不會*編譯Python代碼。進入python * bytecode *,它們基本上是CPython虛擬機的機器指令。但是,這不是Python實現的要求。請參閱[dis'模塊的文檔](https://docs.python.org/3.6/library/dis.html)。 –

+0

@GRB這種情況下,我不認爲其他人需要安裝python和libs。在安裝結束時,你會得到一個可執行文件,只要你想。我建議你多關注一下setuptools –

2

我不知道通過編寫「freeze」應用程序你真的是什麼東西,但是如果我理解它,你需要將你的代碼編譯成安裝程序,只需安裝運行程序所需的所有庫和文件,所以它可以處理任何noob計算機用戶。

好的。現在你有兩個選擇:

A)讓安裝程序爲每個系統單獨 - 您可以使用工具,如Inno setup或PackageBuilder(在Mac)來創建安裝程序,如果有什麼檢查已經安裝(如果沒有安裝蟒蛇)並複製你的文件+在桌面上創建快捷方式(或類似的東西)+運行外部腳本(如果你需要)或者如果你需要Windows的二進制文件,你可以使用Py2exe或在mac Py2app。在Linux上沒有這樣的東西,但是如果使用Linux的人通常是高級用戶。

如果我知道沒有像所有平臺一樣的自動構建器來構建python安裝程序,但是如果你有一些錢,你可以用Bitrock Install Builder來提高你的工作。

B)讓自己的腳本 - 如果用戶已經擁有了Python中,你可以下載並手動安裝文件腳本(由我最好的解決方案,如果是高級用戶提出的產品,但如果你做一些GUI豈不會對新手來說是個問題)

4

期望程序是一個獨立包的唯一平臺是ms-windows。這主要是由於與本地工具鏈相關的歷史原因。例如,直到2016年的ms-toolchain(IIRC),像numpy這樣的Python擴展模塊必須與完全一樣編譯爲與Python本身相同的ms-toolchain版本。這使得爲​​ms-windows構建擴展模塊非常痛苦。

大多數類UNIX操作系統都具有功能性包管理(儘管在Apple的OS-X中由第三方提供)。這使得安裝Python相對容易。

可能有用的是將您的應用程序打包成一個zipfile,如youtube-dl。我寫了一個名爲build.py的腳本,用於我的一些程序。

2

的Ren'Py

你提到Ren'Py幾次。它的documentation描述瞭如何將Python代碼添加到遊戲中。 Python Statements節甚至描述了how to add third party packages(例如numpy和matplotlib)。它可以generate files for Windows, Mac, and Linux。如果你能按照你想要的方式來運行應用程序,並且你已經熟悉它,那麼你應該使用它。

PyInstaller

另一種選擇是PyInstaller。在Supporting Multiple Operating Systems部分,它這樣說:

如果您需要分發您的應用程序超過一個操作系統,例如Windows和Mac OS X兩種,你必須在每個平臺上安裝PyInstaller並分別在捆綁您的應用程序每。

第二段介紹瞭如何執行此一臺機器上:

您可以從一臺機器使用虛擬化做到這一點。免費的virtualbox或付費的VMWare和Parallels允許您以「guest」的身份運行另一個完整的操作系統。您爲每個「guest」操作系統設置一個虛擬機。在其中安裝Python,應用程序需要的支持包以及PyInstaller。

PyInstaller發佈了support for numpy and matplotlib

虛擬機和主機操作系統

你說你沒有在你的SSD虛擬機室。您可以購買外置USB硬盤驅動器並在其上存儲虛擬機。或者您可以使用操作系統託管提供商。您可以使用Google瞭解更多有關這些內容的信息。如果您有關於如何使用特定的託管服務提供商的問題,您應該創建新的問題。

跨平臺測試

即使你使用的Ren'Py,你幾乎肯定會需要測試虛擬機或主機操作系統的結果。只有這樣,可以肯定,你的程序將在其他平臺上正確運行是測試它在這些平臺上。該託管解決方案可以讓你避免「支付將用於每年幾次編譯一個免費軟件,操作系統許可證」。但是,您仍然會爲託管花錢。

價格免費

如果你的目標是開發適用於Windows,Mac和Linux Python應用程序而無需花費任何金錢,那麼你可能卡住的Ren'Py依靠用戶來幫助你在他們的操作系統上測試你的應用。

2

初始反應

  • for Windows一起使用p2exe
  • 對於Linux的使用python's freeze
  • 適用於MacOS使用相同的凍結 - 應該工作(只是猜測,只能由一個谷歌搜索舉起)

(可能需要對您的程序進行更改,例如__file__無法使用)


可能的替代辦法最初的問題

< ...>並沒有遇到太大的熱情,因爲許多潛在用戶並沒有像 下載和安裝Python

的想法

也許用戶的反對可以治癒的,通過包括旁邊的程序Python安裝程序本身。 (無論是實際的Python安裝程序或http://portablepython.com/
即加不只是鏈接到安裝,但所有的安裝和可能的BAT/SH腳本安裝一切。

2

在工作中,我做了一些像你想要的事情,最後我寫了自己的代碼來完成它。一切都建立在Linux上,但我同時提供Linux和Windows軟件包。這些軟件包包括Python解釋器和庫,無論客戶是否已安裝Python,它們的工作方式都是相同的。

本質上,您需要一個嵌入Python解釋器的小程序,並將其設置爲只加載您發佈的Python代碼,而忽略任何系統安裝的Python。正確書寫,這個程序可以交叉編譯每個你想要支持的體系結構。然後,您將爲該體系結構提供您需要的Python DLL,以及一個將使用Python代碼的zip文件(您只需要.pyc.pyo文件)。這個zip文件還必須包含儘可能多的標準庫。

注意事項:

  • 您仍然需要進行測試的虛擬機。
  • 爲每個體系結構正確設置C交叉編譯器可能具有挑戰性。
  • 無論是Python的site.py還是virtualenv使用的都不會將您從系統Python安裝中分離出來。我不得不做我自己的版本site.py
  • 很容易鏈接到系統Python錯誤。在構建腳本中,如何使用pkg-config和編譯器參數時要非常小心。
  • Python很容易錯誤地嘗試加載系統Python庫。要非常小心地設置Python路徑,可能是Py_IgnoreEnvironmentFlag
  • 對於Windows,您可以用py2exe獲得相當遠的距離,而且比我建議的要容易。我不使用py2exe,主要是因爲我將Python代碼嵌入到非Python應用程序中。

因爲我的應用程序是用Go編寫的,所以我將封裝器作爲一個Go包打包,通過cgo調用Python WSGI代碼。你可以看到大部分的Python嵌入代碼here。但是,回購並不是全部內容:自定義Python構建腳本以及構建腳本和應用程序本身的初始化代碼現在都不公開。

相關問題