Oli*_*ver 7 ubuntu pip python-3.x docker
我需要在我从官方“ubuntu”Docker 映像构建的自定义 Docker 容器中安装 Python 包,因此我想尽量减少它使用的空间。Python3 安装正常并运行,但由于某种原因,不包括 pip。
所以我通过 安装apt install python3-pip
,这有效,但它是一个惊人的 300 megs 并且需要几分钟的时间来安装(显然是因为它安装了 sh*load 的东西来从 gcc 等构建二进制包)。
当然,我可以在安装我想要的依赖项后从映像中卸载 python3-pip,另外还可以apt autoremove
用来摆脱 299 megs。但是,这还需要一分钟。
因此,尽管上述方法有效,但它显着增加了我的 Docker 映像的构建时间。所以我尝试看看是否有一种无需pip即可安装依赖项的方法:
我尝试.tar.gz
从 PyPI下载依赖项,提取并尝试python3 setup.py install
,但这给我带来了一个奇怪的错误:
Traceback (most recent call last):
File "setup.py", line 59, in <module>
from distutils import log
ImportError: cannot import name 'log'
Run Code Online (Sandbox Code Playgroud)
我想也许我需要安装 setuptools 或升级 distutils。
我尝试get-pip.py
从官方网站使用,但也失败了:
Traceback (most recent call last):
File "get-pip.py", line 20890, in <module>
main()
File "get-pip.py", line 197, in main
bootstrap(tmpdir=tmpdir)
File "get-pip.py", line 82, in bootstrap
import pip._internal
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/__init__.py", line 40, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/autocompletion.py", line 8, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/main_parser.py", line 8, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/cmdoptions.py", line 17, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为如果我启动 python3,import sysconfig
工作正常。
我也尝试过apt install python-pyyaml
(我在 Docker 映像中需要的依赖项),但这似乎不存在。
所以我别无选择。
当没有apt install something
可用于 python 包时,以下是如何执行此操作。感谢@Anthon 和@digitalarbeiter,他们的回答为达成解决方案提供了重要信息。
通过 setup.py 文件安装(尤其是在 Ubuntu Docker 容器中有用):
这对我来说就足够了
apt install python3-distutils
<download package, tar xvf, cd to folder>
python3 setup.py install
Run Code Online (Sandbox Code Playgroud)这种安装方法仅适用于纯 Python 包(不应感到惊讶),这意味着具有非纯 Python 依赖项的 Python 包可能无法安装,或者如果安装了,某些功能将不可用。
python3 -m distutils
,也可以工作;这意味着 Python3 via 附带的内置 distutilsapt install python3
并不是完整的 distutils;我不知道,这个事实有没有在任何地方提到过?要在没有 gcc 工具链的情况下安装 pip:这对我来说就足够了
apt install python3-distutils
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
Run Code Online (Sandbox Code Playgroud)
然后就pip install pyyaml
完成了。它似乎是从 a 安装的,.tar.gz
所以它也是纯 Python 实现。不奇怪。如果无法通过以下方式安装软件包,则此技术很有用apt install python3-<package>
上述方法只需要几兆磁盘空间。
对我来说,另外几个缺失的拼图是:
apt install python3-<something>
:
py<something>
PyPI 上调用的包, apt installpython3-<something>
不是python3-py<something>
。不幸的apt search pyyaml
是这里没有帮助。apt search <something>
:我有点忘记了,因为(桌面)Ubuntu 上的 bash 在找不到命令时会自动建议下载正确的包。
apt search yaml
生成了 81 个包,提供多种语言(Python 2、Python 3、nodejs、Java、Go、Ruby、Erlang、Lua、Perl、C、C++、Clojure)、linter、模式验证器等的 YAML 读/写。apt search yaml python3
显示了我错过的 python3-yaml。apt search pyyaml
产生任何结果。我找不到包含这些字段的方法。Source
Homepage
apt show python3-yaml
search