離線安裝適用於網絡有問題的環境、inbound 入口被限制等情況。
Wheel 包不適配
Wheel 包的名稱含義
distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl
-- 來自 https://www.python.org/dev/peps/pep-0425/#use
例子:greenlet-0.4.12-cp27-cp27m-manylinux1_x86_64.whl
,這里省略了 {python tag}
。
平台不適配
由於默認情況下,wheel 包的平台是運行 pip download
命令 的平台,所以可能出現平台不適配的情況。比如在 MacOS 系統下得到的 pymongo-2.8-cp27-none-macosx_10_10_intel.whl
就不能在 linux_x86_64
安裝。
很自然地,我們會想到去更改 pip download
生成的 wheel 包對應的平台。依照官方的例子
$ pip download \
--only-binary=:all: \
--platform linux_x86_64 \
--python-version 33 \
--implementation cp \
--abi cp34m \
pip>=8
-- 來自 https://pip.pypa.io/en/stable/reference/pip_download/#examples
我們可以正常運行。
但是運用以上命令安裝多個包時,你會發現很多包都找不到。
$ pip download \
> --only-binary=:all: \
> --platform linux_x86_64 \
> --python-version 33 \
> --implementation cp \
> --abi cp34m \
> tornado
Collecting tornado
Could not find a version that satisfies the requirement tornado (from versions: )
No matching distribution found for tornado
我猜測是對應的項目沒有提供符合條件的二進制包。
Abi tag 不適配
查看 Python 支持的 tag
目標機器
$ python -c "from pip import pep425tags;print(pep425tags.supported_tags)"
[('cp27', 'cp27m', 'manylinux1_x86_64'), ('cp27', 'cp27m', 'linux_x86_64'), ('cp27', 'none', 'manylinux1_x86_64')...]
打包機器
[('cp27', 'cp27mu', 'manylinux1_x86_64'), ('cp27', 'cp27mu', 'linux_x86_64'),
如果在是通過 cp27mu
打出的包,那么在目標機器就不能安裝,因為目標機器沒有 cp27mu
。錯誤信息為 package.whl is not a supported wheel on this platform
解決辦法
使用非二進制包安裝。
pip download --no-binary=:all: package_name
# --no-binary=:all: 對於包以及包的依賴包,都不使用二進制
# -- 來自 https://pip.pypa.io/en/stable/reference/pip_download/#cmdoption-no-binary
對於下載下來的 tar.gz
文件,可以直接使用 pip install
安裝。相比 wheel 包,這種包在安裝時會進行編譯,所以花費的時間會長一些。
更進一步
使用上面的解決辦法有兩種情況
- 挑出不兼容的包,然后使用下載非二進制包。結果是二進制包和非二進制包混合
- 不進行挑選,全部下載非二進制包。由於非二進制包在安裝時要進行編譯,所以安裝時間會更長
最好的情況是提供適配目標機器的二進制包。
- 找到與目標機器 Python 環境相同的機器
- 下載非二進制包
- 在與目標機器相同的環境進行編譯
關於第三點,因為
Build a wheel that’s named such that it’s only usable on the platform that it was built on -- 來自 https://packaging.python.org/tutorials/distributing-packages/#platform-wheels
完整步驟
- 安裝 pip2pi。
pip install pip2pi
- 使用 pip2pi 下載並打包。
pip2pi packages/ --no-use-wheel -r absolute_path_to/requirements.txt
- 壓縮
tar zcfv packages.tar.gz packages/
- 上傳到目標服務器。
- 解壓
tar zxvf packages.tar.gz
- (可選,因為我把 virtualenv 也放入了 requirements.txt 中)安裝虛擬環境。
pip install --index-url=file://absolute_path_to/packages/simple virtualenv
(注意這里的simple
) - 創建虛擬環境
virtualenv env
- 激活虛擬環境
source env/bin/activate
- 安裝剩余依賴。
pip install --index-url=file://absolute_path_to/packages/simple -r requirements.txt