2012-06-18 207 views
82

什麼是下載python軟件包的最佳方式,以及pypi的依賴關係,以便在另一臺機器上進行離線安裝?有沒有簡單的方法用pip或easy_install來做到這一點?我試圖在未連接到互聯網的FreeBSD盒子上安裝請求庫。Python軟件包離線安裝

+1

相關:[如何根據requirements.txt從本地目錄安裝軟件包?](http://stackoverflow.com/q/7225900/95735) –

回答

42

如果軟件包位於PYPI上,請將其及其依賴項下載到某個本地目錄。 例如

 
$ mkdir /pypi && cd /pypi 
$ ls -la 
    -rw-r--r-- 1 pavel staff 237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz 
    -rw-r--r-- 1 pavel staff 389741 Feb 22 17:10 Jinja2-2.6.tar.gz 
    -rw-r--r-- 1 pavel staff 70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz 
    -rw-r--r-- 1 pavel staff 2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz 
    -rw-r--r-- 1 pavel staff 1108056 Feb 22 17:10 Werkzeug-0.8.2.tar.gz 
    -rw-r--r-- 1 pavel staff 488207 Apr 10 18:26 boto-2.3.0.tar.gz 
    -rw-r--r-- 1 pavel staff 490192 Apr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz 

某些軟件包可能需要手動歸檔到類似的外觀tarball中。當我想要更新的(不太穩定的)版本的東西時,我會做很多事情。一些軟件包不在PYPI上,所以它們也是如此。

假設您在~/src/myapp中有正確形成的Python應用程序。 ~/src/myapp/setup.py將有install_requires列表,其中提到了您在/pypi目錄中的一件或多件事情。像這樣:

install_requires=[ 
    'boto', 
    'Flask', 
    'Werkzeug', 
    # and so on 

如果你希望能夠與所有必要的依賴運行你的應用程序,同時它還是黑客攻擊,你會做這樣的事情:

 
$ cd ~/src/myapp 
$ python setup.py develop --always-unzip --allow-hosts=None --find-links=/pypi 

這樣,你的應用程序將直接從你的源代碼目錄執行。你可以破解東西,然後重新運行應用程序而不重建任何東西。

如果你想安裝你的應用和它的依賴到當前Python環境,你會做這樣的事情:

 
$ cd ~/src/myapp 
$ easy_install --always-unzip --allow-hosts=None --find-links=/pypi . 

在這兩種情況下,如果一個或多個依賴AREN」的構建就會失敗t目前在/pypi目錄中。它不會試圖從互聯網混雜安裝丟失的東西。

我強烈建議在有效的virtual environment之內調用setup.py develop ...easy_install ...以避免污染您的全局Python環境。這是(virtualenv),相當多的路要走。切勿在全球Python環境中安裝任何東西。

如果您構建應用程序的計算機與您要部署它的計算機具有相同的體系結構,則可以簡單地對整個虛擬環境目錄進行壓縮,將其全部放入其中。就在tarballing之前,您必須使虛擬環境目錄可重新定位(請參閱--relocatable選項)。 注意:目標機器需要安裝相同版本的Python,並且您的應用程序可能具有的任何基於C的依賴關係也必須預先安裝(例如,如果您依賴於PIL,那麼libpng,libjpeg等必須是預裝)。

+2

而不是'--allow-hosts = None'您可以使用開關'--no-index' – romor

+0

請您詳細說明如何創建一個正確形成的Python應用程序? –

+2

@PrabhjotRai請參閱https://packaging.python.org/distributing/ –

4

下載tarball,將它傳送到FreeBSD機器並解壓縮,之後運行python setup.py install,就完成了!

編輯:只需添加一下,你也可以現在用pip安裝tarball。

+1

所有依賴關係如何?解決它們的最好方法是什麼?我是否也需要手動安裝依賴關係? –

+0

是的,這是我知道的唯一方式。 – dav1d

157

我使用-d(或--download)選項到pip install,這使得從PyPI下載sdist tarball的過程變得更加簡單。例如,pip install --download /path/to/some/dir celery會將芹菜及其所有依賴項的sdist tarball下載到/path/to/some/dir(但不會安裝它們)。然後,您可以使用pip install --no-index --find-links /path/to/some/dir/ celery使用下載的sdist安裝芹菜,而無需訪問網絡。如果您在這兩個命令與-r requirements.txt,其中requirements.txt是一個點要求文件列出所有你需要的軟件包取代celery(也可以選擇你想要的版本)

的同樣的過程。

UPDATE

棄用:PIP安裝 - 表格下載已被棄用,並將於 在未來刪除。 PIP現在有一個download命令,應該使用 。

的命令是這樣的:
pip download -r requirements.txt

對於python3:
pip3 download -r requirements.txt

+0

問題是,依賴項可能具有其他依賴項,並且這些依賴項不會被下載。 – vikki

+0

[Snake basket](https://github.com/prezi/snakebasket)(建立在pip之上)也會下載依賴關係的依賴關係。 – vikki

+4

@vikki不正確,「pip install --download」也會下載依賴關係,因此即使您的需求具有其他依賴關係,上述命令也能正常運行。 Snake籃子可能會做其他有用的事情(從未使用過),但這絕對不是必需的。 –

2

畫中畫8.1.2,您可以使用pip download -r requ.txt將包下載到本地計算機。

2

脫機python。這樣做的我使用的virtualenv(隔離Python環境)

1)安裝的virtualenv 在線與PIP:

pip install virtualenv --user 

或脫機WHL:去這個link,下載最新版本(.whl或焦油。 GZ)並安裝使用下面的命令:使用--user

pip install virtualenv-15.1.0-py2.py3-none-any.whl --user 

你不需要使用sudo pip…

2)使用在線機器上的virtualenv

選擇與終端cd一個目錄,並運行此代碼:

python -m virtualenv myenv 
cd myenv 
source bin/activate 
pip install Flask 

安裝所有的包後,你必須生成一個requirements.txt所以當你的virtualenv是激活,寫入

pip freeze > requirements.txt 

打開一個新的終端並創建另一個env,如myenv2

python -m virtualenv myenv2 
cd myenv2 
source bin/activate 
cd - 
ls 

現在你可以去那裏你requirements.txttranferred_packages夾在那裏,你的脫機文件夾。用下面的代碼下載軟件包,並把它們全部放到tranferred_packages文件夾中。

pip download -r requirements.txt 

把你的脫機文件夾脫機計算機,然後

python -m virtualenv myenv2 
cd myenv2 
source bin/activate 
cd - 
cd offline 
pip install --no-index --find-links="./tranferred_packages" -r requirements.txt 

什麼是在文件夾脫機[requirements.txt,tranferred_pa​​ckages {燒瓶0.10.1.tar.gz,...}你的包

pip list 

注意]

檢查表:因爲我們是在2017年,最好是使用Python 3喲你可以用這個命令創建python 3 virtualenv。

virtualenv -p python3 envname 
+0

似乎有步驟丟失或「混淆」在這裏,我希望看到一個'停用',然後'點凍結'...離線和./tranferred_pa​​ckages出現從無處 - 顯然這需要清理? – Hannu

+0

也許,但你應該考慮'我想要一個簡短的帖子','這個過程很複雜,我不能寫每一步(只有在YouTube上纔有可能)「。 – cyera

2

使用wheel編譯包。

束起來:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) 
$ pip wheel -r requirements.txt --wheel-dir=$tempdir 
$ cwd=`pwd` 
$ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *) 

副本壓縮包並安裝:

$ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) 
$ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2) 
$ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/* 

wheel二進制包不能跨機器。

更多文獻這裏:https://pip.pypa.io/en/stable/user_guide/#installation-bundles

+1

我在使用Python 3.6綁定到機器上時遇到了問題,而在使用Python 3.5解壓時出現了問題:「_ .whl在此平臺上不受支持」。源和目標版本可能需要與某些軟件包匹配。 –