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明明安裝好了: