Python установить без пипа на Ubuntu - PullRequest
0 голосов
/ 03 ноября 2018

Мне нужно установить пакет Python в пользовательский контейнер Docker, который я создаю из официального образа Docker 'ubuntu', поэтому я хочу минимизировать, сколько места он использует. Python3 отлично работает и работает, но по какой-то причине pip не включен.

Итак, я установил через apt install python3-pip, это работает, но это колоссальные 300 мегабайтов и установка занимает пару минут (очевидно, потому что он устанавливает кучу вещей для сборки бинарных пакетов из gcc и т. Д.).

Конечно, я мог удалить python3-pip из образа после установки желаемых зависимостей и дополнительно использовать apt autoremove, чтобы избавиться от 299 мегабайт. Однако это займет еще минуту.

Таким образом, хотя вышеприведенное работает, оно значительно увеличивает время сборки моего образа Docker. Поэтому я попытался проверить, можно ли установить зависимость без пипа:

Я попытался загрузить .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'

Я подумал, что, возможно, мне нужно установить 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'

, что очень странно, потому что, если я запускаю python3, import sysconfig работает нормально.

Я также попытался apt install python-pyyaml (зависимость, которая мне нужна в моем образе Docker), но, похоже, ее нет.

Так что у меня нет выбора.

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Я устанавливал pip из контейнеров pip-get.py в Docker (Ubuntu) в течение нескольких лет без проблем. Для меня это лучший способ не получать предупреждения об устаревших сообщениях или (в какой-то момент, некоторое время назад) ошибки, связанные с SSL.

Итак, вторая часть вашего ответа близка, но ваша установка на python кажется слишком минимальной, вам нужно sysconfig, как указано в python-distutils. Вы можете попробовать это довольно минимально Dockerfile:

FROM ubuntu:latest

MAINTAINER Anthon

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get install -y \
  python3 \
  python3-distutils \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# this gets you the latest pip
COPY pip/get-pip.py /tmp/get-pip.py
RUN python3 /tmp/get-pip.py

RUN pip3 install pyyaml

который я запустил используя это Makefile:

doit:   pip/get-pip.py
        docker build .

pip/get-pip.py:
        -@mkdir pip
        curl https://bootstrap.pypa.io/get-pip.py -o pip/get-pip.py

(это должны быть символы TAB на линиях с отступом), чтобы убедиться, что pip-get.py доступен из контекста (вы, конечно, можете загрузить его из Dockerfile, но это не обязательно). Это заканчивается успешной установкой PyYAML, но она будет медленной.

Я рекомендую вам начать использовать ruamel.yaml (заявление об отказе: я являюсь автором этого пакета), изменив последнюю строку файла Docker следующим образом:

RUN pip3 install ruamel.yaml

Помимо множества исправлений в исходном коде PyYAML, на котором он основан, ruamel.yaml поддерживает YAML 1.2 и YAML 1.1 (заменено в 2009 году и поддерживается версией PyYAML) и устанавливает соответствующую версию из Файл .whl, так что в вашем контейнере будет доступен быстрый загрузчик C (PyYAML этого не делает).

Вы можете загрузить файл YAML с помощью загрузчика C в ruamel.yaml, используя:

from pathlib import Path
from ruamel.yaml import YAML


path = Path('yourfile.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
0 голосов
/ 03 ноября 2018

Если для пакета python нет apt install something, вот как это сделать. Благодаря @Anthon и @digitalarbeiter, их ответы предоставили важную информацию, чтобы прийти к решению.

  • Для установки через файл setup.py (особенно в контейнере Ubuntu Docker):

    • мне было достаточно

      apt install python3-distutils
      <download package, tar xvf, cd to folder>
      python3 setup.py install
      
    • Этот метод установки работает только для чистых пакетов Python (не должно быть сюрпризом), что означает, что пакеты Python, которые имеют не чистые зависимости Python, могут не устанавливаться или, если они это сделают, будут иметь некоторые функции недоступен.

    • Обратите внимание, что даже до установки python3-distutils, python3 -m distutils работало; это означает, что встроенный distutils, который поставляется с Python3 через apt install python3, не является полным distutils; Я этого не знал, упоминается ли когда-нибудь этот факт?
  • Для установить пункт без набора инструментов gcc : мне было достаточно

    apt install python3-distutils
    wget https://bootstrap.pypa.io/get-pip.py
    python3 get-pip.py
    

    Затем pip install pyyaml завершено. Казалось, что установка с .tar.gz, так что это тоже чистая реализация Python. Неудивительно. Этот метод полезен, если пакет не устанавливается через apt install python3-<package>

Приведенным выше методам требовалось всего несколько мегабайт дискового пространства.

Пара других недостающих частей головоломки для меня были:

  • apt install python3-<something>:

    • Я упустил тот факт, что многие пакеты Python распространяются таким образом в Debian, что удобно для пакетов, которые имеют реализацию C (или зависимости C), поскольку компиляция не требуется.
    • И я не знал, что для пакетов, которые называются py<something> в PyPI, установка apt будет python3-<something> НЕ python3-py<something>. К сожалению apt search pyyaml здесь не помог.
  • apt search <something>: я как бы забыл об этом, потому что bash на (настольной) Ubuntu автоматически предлагает правильный пакет для загрузки, когда команда не найдена.

    • В частности, apt search yaml дает 81 пакет, который обеспечивает чтение / запись YAML на нескольких языках (Python 2, Python 3, nodejs, Java, Go, Ruby, Erlang, Lua, Perl, C, C ++, Clojure), linter, валидатор схемы и т. д.
    • Несколько поисковых терминов являются AND'ами, поэтому apt search yaml python3 показал python3-yaml, который я пропустил.
    • К сожалению apt search pyyaml не дает результатов, eventhough поля Source и Homepage apt show python3-yaml содержат слово "pyyaml". Я не смог найти способ заставить search включать эти поля.
0 голосов
/ 03 ноября 2018

Пакет Debian и Ubuntu для PyYAML называется python-yaml, а не python-pyyaml.

sudo apt install python-yaml

или

sudo apt install python3-yaml

соответственно.

(Кажется, что в именах пакетов Debian / Ubuntu часто пропускается любой дополнительный префикс «py», который может иметь пакет Python: это apt install python-tz вместо python-pytz тоже. Им, похоже, не нравится р-резервирование.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...