2016-07-07 82 views
3

我有一個python項目,有一些依賴項(在setup.py中定義在install_requires下)。我的操作人員需要一個自包含的包,只依賴於python安裝。試金石測試是他們能夠得到一個zip文件,然後在沒有互聯網連接的情況下解壓縮並運行它。使用依賴包打包python項目的標準方式是什麼?

有沒有簡單的方法來打包包括依賴性的安裝?如果我必須建立它最終將運行的操作系統/體系結構,這是可以接受的。

對於它的價值,我試過setup.py buildsetup.py sdist,但由於它們不包括依賴關係,它們看起來並不符合法案。我也考慮過virtualenv(如果絕對必要,可以安裝它),但是它具有硬編碼路徑,這使得它不夠理想。

+0

不認爲有一個標準的方法來做到這一點。 – cel

+0

爲什麼不使用requirements.txt和依賴關係?或者運行'pip install -r requirements.txt'是不行的? – valignatev

+0

我認爲你必須創建一個捆綁的可執行文件,其中有各種工具。順便說一句,如果你有「devops人」,並且不能部署你自己,*這不是devops *。 – jonrsharpe

回答

4

有一些細微的差別如何PIP作品。不幸的是,使用--prefix vendor來存儲項目的所有依賴關係是行不通的,如果任何這些依賴關係或依賴關係的依賴關係被安裝到pip可以找到它們的地方。它會跳過這些依賴關係,並將其餘的安裝到您的vendor文件夾中。

以前我用virtualenv的--no-site-packages選項來解決這個問題。在一家公司,我們將發佈整個virtualenv,其中包括python二進制文件。爲了只運送依賴關係,您可以使用virtualenv與pip上的--prefix開關結合使用,爲您提供一個安裝在正確位置的乾淨環境。

我將提供一個示例腳本,用於創建臨時virtualenv,激活它,然後將依賴項安裝到本地vendor文件夾。如果您在CI中運行,這很方便。

#!/bin/bash 

tempdir=$(mktemp -d -t project.XXX) # create a temporary directory 
trap "rm -rf $tempdir" EXIT   # ensure it is cleaned up 
# create the virtualenv and exclude packages outside of it 
virtualenv --python=$(which python2.7) --no-site-packages $tempdir/venv 
# activate the virtualenv 
source $tempdir/venv/bin/activate  
# install the dependencies as above 
pip install -r requirements.txt --prefix=vendor 
1

在大多數情況下,您應該能夠「供應」所有依賴項。這基本上是一個virtualenv的粗糙版本。

例如,看看requests如何打包includes chardet and urllib3在它自己的源代碼樹中。下面是一個示例腳本,應該爲您執行初始下載和複製:https://gist.github.com/proppy/1136723

一旦您安裝了依賴項,您可以使用from .some.namespace import dependency_name引用它們以確保您使用的是本地版本。

0

可以用pip(我使用的是8.1.2)的最新版本做到這一點。在構建機器:

pip install -r requirements.txt --prefix vendor 

然後運行它:

PYTHONPATH=vendor/lib/python2.7/site-packages python yourapp.py 

(這基本上是@valentjedi評論的擴張感謝!)

+0

此'--prefix vendor'似乎與添加供應商名稱無關,只是指定要安裝軟件包的文件夾。 – ThorSummoner

+0

正確,它只是放置自營依賴關係的文件夾的名稱。 –

相關問題