在ubuntu上安装没有pip的python

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 映像中需要的依赖项),但这似乎不存在。

所以我别无选择。

Oli*_*ver 1

当没有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-distutils之前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>:

    • 我错过了这样一个事实,即许多 Python 包在 Debian 中都是以这种方式分发的,这对于具有 C 实现(或 C 依赖项)的包来说很方便,因为不需要编译。
    • 而且我不知道对于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 读/写。
    • 多个搜索词进行 AND 运算,因此apt search yaml python3显示了我错过的 python3-yaml。
    • 不幸的是,即使和字段包含单词“pyyaml”,也不会apt search pyyaml产生任何结果。我找不到包含这些字段的方法。SourceHomepageapt show python3-yamlsearch