1. 程式人生 > 實用技巧 >Arm64伺服器離線安裝pip包

Arm64伺服器離線安裝pip包

1. 正確操作

背景

內網伺服器無法連線網際網路,需要在內網伺服器物理機上安裝開發需要的pip軟體包。

系統為arm架構,需要在有網路的伺服器上準備好需要的pip包,然後拷貝到內網伺服器上離線安裝。

聯網伺服器上操作

編輯需要的pip包檔案 requirements.txt,其中Cython為scikit-learn安裝時需要的包,不寫的話不會被下載下來:

grpcio == 1.33.2

grpcio-tools == 1.33.2

schedule == 0.6.0

Cython == 0.29.21

numpy == 1.19.3

pandas == 1.1.4

jupyterlab == 2.2.9

matplotlib == 3.3.2

scikit-learn == 0.23.2

seaborn == 0.11.0

sweetviz == 2.0.2

下載requirements.txt檔案中的pip包:

pip download -d packages -r requirements.txt

下載下來的大部分為為.whl檔案,但有一些為.tar.gz原始碼檔案,因為很多包沒有做aarch64的whl檔案。

注:如果pip download的有網路環境的機器不是arm64架構,需要用 --platform 引數指定系統環境。

把whl檔案和tar.gz分開到不同目錄,並打包資料夾。

cd packages
mkdir whl targz mv *.whl whl mv *.tar.gz targz cd .. tar -cvzf packages.tar.gz packages

內網離線伺服器上操作

packages.tar.gz上傳到伺服器python3-env(自己建立的)目錄,並解壓。

建立並進入虛擬環境,會在當前工作目錄下產生一個資料夾:

cd aidev
python -m venv dev-env
source dev-env/bin/activate

以下操作均在 dev-env 環境中。

首先安裝whl 格式的pip包:

# 進入packages目錄
pip install whl/* --no-deps           # 安裝whl包,--no_deps引數不加無法安裝上

接下來安裝tar.gz檔案。

解壓targz下的所有.tar.gz檔案:

進入解壓後的資料夾,執行以下命令:

python setup.py install

除matplotlib,pyzmq,和scikit-learn外的包都可以順利安裝上。

pyzmq問題如下:

按提示執行以下命令可順利安裝:

pip install .

注:在之前試錯(2中錯誤操作2)的過程中,安裝了zeromq3-devel,不知道不裝的話是否會有影響。https://pypi.org/project/pyzmq/

# 離線安裝zeromq3-devel
# ------ 有網路機器
yum -y install yum-utils
yum install epel-release
repotrack zeromq3-devel     # 下載離線安裝包

# ------ 內網無網路連線機器上
# 進入目錄
rpm -Uvh --force --nodeps *.rpm

matplotlib問題如下:

按提示下載freetype-2.6.1.tar.gz檔案,解壓後放到 matplotlib-3.3.2/build 目錄下,再次執行 python setup.py 即可。

scikit-learn問題如下(前面安裝了Cython,就不會出錯了,開始時requirements檔案中沒有Cython):

通過安裝Cython解決。

安裝完scikit-learn後匯入sklearn報錯:

解決辦法:退出在scikit-learn-0.23.2目錄,再次執行,就不會報錯。

2. 錯誤嘗試

2.1 錯誤嘗試1

pip download 之後(同1中的requirements.txt, 少了Cython),然後用下圖中的pip install命令安裝。

ERROR: Could not find a version that satisfies the requirement numpy>=1.15 (from versions: none)

ERROR: No matching distribution found for numpy>=1.15

Traceback (most recent call last):

File "/root/aidev/training/lib/python3.7/site-packages/setuptools/installer.py", line 128, in fetch_build_egg

subprocess.check_call(cmd)

File "/usr/local/lib/python3.7/subprocess.py", line 363, in check_call

raise CalledProcessError(retcode, cmd)

subprocess.CalledProcessError: Command '['/root/aidev/training/bin/python3', '-m', 'pip', '--disable-pip-version-check', 'wheel', '--no-deps', '-w', '/tmp/tmp_if8ygbm', '--quiet', 'numpy>=1.15']' returned non-zero exit status 1.

2.3 錯誤嘗試2

在有網路的arm伺服器上 pip wheel 命令下載軟體包,並打包成 whl 檔案(主要是.tar.gz原始碼檔案打包成 whl檔案)。然後在內網伺服器上用pip install 安裝:

pip install --no-index --find-links=/root/python3-env/whl_develop -r /root/python3-env/requirements.txt

安裝成功,pip list能夠看到包,其實沒有真正安裝成功。

執行 jupyter notebook --generate-config 命令會報錯:

ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory

錯誤原因:python3安裝時沒有編譯動態連結庫,詳見 centos7 中安裝python3.x,並編譯動態連線庫。重新安裝python3,再次執行執行 jupyter notebook --generate-config 還是會報錯:

ImportError: /lib64/libstdc++.so.6: symbol __cxa_thread_atexit_impl, version GLIBC_2.18 not defined in file libc.so.6 with link time reference

為解決該問題進行了多種操作,如用 libstdc++.so.6.0.25(來自docker),替換本機的 libstdc++.so.6.0.19 到 libstdc++.so.6的軟連結,又會報別的錯。最後又換回來了。 安裝 zeromq3-devel,還是不能解決問題。

錯誤原因:在別的機器上編譯的檔案(從原始碼打包whl檔案會進行gcc編譯),到別的機器上執行可能會有問題。

2.3 錯誤嘗試3

此錯誤是在正確安裝好之後進行的,想看看pip安裝好whl檔案之後,把matplotlib少的freetype檔案新增進去後,用pip是否可以安裝tar.gz檔案,還是報錯:

ERROR: Command errored out with exit status 1: /root/aidev/dev-env/bin/python /root/aidev/dev-env/lib/python3.7/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-in9tv3sg/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'setuptools>=40.6.0' wheel 'cffi>=1.0' Check the logs for full command output.

用pip list檢視,setuptools 和 cffi明明安裝好了: