`python -m venv foo` не устанавливает pip во вложенной среде - PullRequest
0 голосов
/ 09 июля 2019

Мне нужен был python3.7 для проекта, и он не был доступен в виде пакета ubuntu, поэтому я загрузил среду python3.7 с помощью conda.Из этой «прародительской» среды я создал «родительскую» виртуальную среду python3 для конкретного проекта.

Из родительской среды в моем проекте я запускаю инструмент командной строки из google-cloud-sdkкоторый создает другую среду тестирования.Этот скрипт создает среду внука, вызывая что-то эквивалентное (parent) $ python3 -m venv /tmp/grandchild.

В той среде внука по какой-то причине не установлен двоичный файл pip.И это проблема.Этот отсутствующий пункт приводит к тому, что скрипт Google не может установить зависимости dev-test.Однако у родителя и потомка установлен pip, но pip не передается.

Когда я убираю conda из картинки и полагаюсь только на python, который поставляется с моей системой пакетов ubuntu(в / usr / lib), я могу вкладывать свои виртуальные среды до тошноты, и кажется, что pip всегда наследуется должным образом.Я думаю, что это что-то особенное для сред Python / Pip Conda, на которых я спотыкаюсь.

Я думаю, что это отдельная причина проблемы: Пип отсутствует в Python venv (я неу меня нет этого файла ~ / .pydistutils.cfg где-нибудь на моем боксе)

ОБНОВЛЕНИЕ :

Я нашел способ надежно воспроизвести это, и безнужно для конды.Это происходит, когда родитель создается с помощью virtualenv, то есть virtualenv parent, а ребенок создается из этого родителя с использованием -m venv, то есть (parent) $ python3 -m venv child.Затем дочерний элемент не копируется в него.

Среды вложенности, созданные с помощью virtualenv, работают нормально, а среды вложенности, созданные с помощью venv, тоже хорошо работают, но не тогда, когда venv используется в virtualenv-созданная среда.Они не смешиваются.

Примечание: среды на самом деле не «гнездятся» сами по себе, они являются независимыми копиями.Я имею в виду, что одно создано из другого.

1 Ответ

0 голосов
/ 09 июля 2019

Одним из обходных путей является создание всех сред одним и тем же методом.

например. используйте python3 -m venv для всех сред вдоль цепи.

  1. python3 -m venv parent; source parent/bin/activate
  2. (parent) $ python3 -m venv child

Если вам кажется, что это запутывает вас в сеть символических ссылок, вы также можете указать флаг --copies: python3 -m venv --copies …, который может этого избежать.

...