2012-07-11 94 views
17

我有一個簡單的腳本,它依賴於dnspython來解析區域文件。我想將這個腳本作爲一個單獨的.py來發布,只要安裝了2.6/2.7,用戶就可以運行它。我不希望用戶在站點範圍內安裝依賴項,因爲可能會與現有的軟件包/版本發生衝突,也不希望他們使用virtualenv。我想知道是否有一種方法在腳本中嵌入像dnspython這樣的包(gzip/base64),並讓該腳本在運行時訪問該包。也許解壓縮到/ tmp中的目錄並將其添加到sys.path?我並不擔心啓動開銷,我只想包含一個可以分發的單獨的.py /所有依賴項。有沒有辦法在python腳本中嵌入依賴關係?

另外,不會有C依賴性來構建,只有純Python包。

編輯:腳本不一定是.py。只要它是一個單一的可執行文件即可。

+3

如果您可以放寬一個文件限制,您可以將dnspython庫與.py文件一起打包,既可以作爲zip文件,也可以作爲常規獨立文件 - 這將解決依賴性問題。你堅持只有一個文件嗎? – 2012-07-11 16:10:32

+4

許可證地獄的道路鋪設嵌入... – 2012-07-11 16:13:53

+0

@MahmoudAbdelkader我想這會工作。在查看其他地方之前,Python會查看包的當前目錄(儘管我認爲這個順序在3中改變)。仍然希望有一種方法可以將所有依賴關係打包爲用戶可以運行並且沒有任何問題的可執行文件。我想它不一定是.py。 – 2012-07-11 16:28:53

回答

8

您可以將多個Python文件打包成一個.egg文件。蛋文件本質上就是具有定義好的元數據的zip文件 - 查看setuptools文檔以瞭解如何執行此操作。根據docs,您可以通過指定入口點來直接執行egg文件。這會給你一個單一的可執行文件,可以包含你的代碼+任何其他的依賴關係。

編輯:現在我會建議建立一個PEX做到這一點。 pex基本上是一個非stdlib依賴關係的可執行zip文件。它不包含python發行版(如py2app/py2exe),但包含其他所有內容,並且可以使用單個命令行調用進行構建。 https://pex.readthedocs.org/en/latest/

+1

謝謝,我正在試圖用setuptools來製作一個雞蛋。從來沒有建立過雞蛋,因爲我一直聽說他們已經失寵。 – 2012-07-11 17:00:09

2

請不要這樣做。如果你確實不養成這樣的習慣。

  • pydns是BDS許可,但如果你嘗試「嵌入」 GPL的模塊以這種方式,你可以遇到麻煩
  • 讓你可以學習使用setuptools,你會從長遠來看,更快樂
  • setuptools將處理您確定的依賴項的安裝(我不確定您使用的pydns是否爲純python,因此如果您嘗試在不知道環境的情況下自行添加它,則可能會爲用戶創建問題)
  • 您可以設置一個url或pypi,以便人們可以用easy_install升級腳本-U
+0

我正在使用的軟件包是dnspython,而不是pydns。如果setuptools可以構建一個只需要python 2.6/2.7的可分發可執行文件,我將使用它。如果你只是簡單地使用它來安裝站點範圍內的依賴關係,那麼這不是我所要求的。 dnspython是純粹的Python,我沒有看到它的許可證會阻止我嵌入它。最終用戶不是開發人員,對python生態系統一無所知(setuptools/easy_install/pip/virtaulenv/etc)。 – 2012-07-11 16:54:09

3

最簡單的方法就是將名爲__main__.py的Python腳本與純粹的Python依賴關係放在一個zip存檔中,example

否則PyInstaller可用於生成獨立的可執行文件。

相關問題