Virtualenv: Включить сценарии стандартной библиотеки в сценарии virtualenv.

Созданный на 2 авг. 2019  ·  22Комментарии  ·  Источник: pypa/virtualenv

Похоже, 2to3 в настоящее время не перенаправляется Virtualenv. См. https://travis-ci.community/t/2to3-command-not-found-in-virtualenv-in-bionic/4495 для случая, когда это было неожиданно для пользователя, поскольку обычно оно доступно на PATH для установки Linux.

В свете того, что Py2 приближается к EOL, спрос на него будет расти!


  • [X] Минимально воспроизводимый пример или подробное описание
$ which 2to3
/home/vmuser/.pyenv/shims/2to3

$ pyenv install 3.6.9
<...>

$ ~/.pyenv/versions/3.6.9/bin/python -m pip install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/db/9e/df208b2baad146fe3fbe750eacadd6e49bcf2f2c3c1117b7192a7b28aec4/virtualenv-16.7.2-py2.py3-none-any.whl (3.3MB)
    100% |████████████████████████████████| 3.3MB 1.3MB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-16.7.2

$ ~/.pyenv/versions/3.6.9/bin/python -m virtualenv test
Using base prefix '/home/vmuser/.pyenv/versions/3.6.9'
New python executable in /home/vmuser/test/bin/python
Installing setuptools, pip, wheel...
done.

$ . test/bin/activate

(test) $ which 2to3
/home/vmuser/.pyenv/shims/2to3

Ожидаемое поведение для последнего which состояло в том, чтобы вернуть путь внутри virtualenv - так же, как, например, для python и pip .

  • [X] ОС и вывод pip list
    Ubuntu Бионический рабочий стол x64
$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package    Version
---------- -------
pip        18.1   
setuptools 40.6.2 
virtualenv 16.7.2 
enhancement help-wanted

Самый полезный комментарий

В качестве обходного пути вы можете использовать python -m lib2to3 внутри вашей виртуальной среды с эквивалентной функциональностью.

Все 22 Комментарий

Это все еще происходит после перефразирования pyenv?

Что выполняет прокладка при запуске до или после перефразирования pyenv?

У меня есть ощущение, что это как-то связано с pyenv.

Это все еще происходит после перефразирования pyenv?

да.

Что выполняет прокладка при запуске до или после перефразирования pyenv?

Поскольку выбран Python system , для которого не установлен пакет apt с 2to3 , он говорит

pyenv: 2to3: command not found

The `2to3' command exists in these Python versions:
<list>

в обоих случаях.

У меня есть ощущение, что это как-то связано с pyenv.

pyenv не имеет значения. Ожидаемое поведение состояло в том, чтобы второй which возвращал прокладку virtualenv , как и для python . Ошибка в том, что virtualenv не создает его. (Я думал, что это очевидно. Вероятно, нет.)

А, ладно... Что такое PATH после активации?

(У меня нет машины, на которой я могу попытаться воспроизвести это прямо сейчас)

(test) vmuser<strong i="5">@ubuntuvm</strong>:~$ echo $PATH
/home/vmuser/test/bin:/home/vmuser/.rbenv/shims:/home/vmuser/.rbenv/bin:/home/vmuser/.pyenv/shims:/home/vmuser/.pyenv/bin:/home/vmuser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vmuser/.rvm/bin
(test) vmuser<strong i="6">@ubuntuvm</strong>:~$ ls /home/vmuser/test/bin
activate       activate_this.py  pip     python3
activate.csh   activate.xsh      pip3    python3.6
activate.fish  easy_install      pip3.6  python-config
activate.ps1   easy_install-3.6  python  wheel

В качестве обходного пути вы можете использовать python -m lib2to3 внутри вашей виртуальной среды с эквивалентной функциональностью.

/cc other @pypa/virtualenv-committers, если они считают хорошей идеей добавление скриптов из стандартной библиотеки в virtualenv при их создании.

Я амбивалентен.

у меня -0,5. Это дополнительный беспорядок, который до сих пор не отмечался как проблема, поэтому я предполагаю, что необходимость в нем возникает редко. Я не уверен, что приближение Python 2 к EOL имеет здесь значение. Дополнительные сценарии также не находятся на PATH в невиртуальной среде Windows, поэтому ожидание их присутствия не является универсальным.

Я думаю, что это должно работать как общий подход. Все приложения в хост-среде должны быть доступны на уровне виртуальной среды.

Я не уверен, что приближение Python 2 к EOL имеет здесь значение.

+1

Это тоже не моя забота. :)

Дополнительные сценарии также не находятся на PATH в невиртуальной среде Windows.

Ой. Разве они не находятся в каталоге Scripts/ ? Насколько я понимаю, текущие установщики python.org добавляют этот каталог в PATH и, следовательно, могут быть выполнены.

Все приложения в хост-среде должны быть доступны на уровне виртуальной среды.

Хм... "приложения" здесь немного расплывчаты - вы имеете в виду скрипты или что-то еще? Не могли бы вы уточнить, что вы имеете в виду?

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

Ой. Разве они не в каталоге Scripts/?

Нет, все, что находится в Scripts , — это обертки точек входа для установленных библиотек (pip, easy_install и wheel в базовой установке). Глядя немного дальше, 2to3.py находится в Tools/scripts (вместе с довольно смешанной группой из более чем 60 других скриптов), но этот каталог не помещается в PATH , даже если пользователь выбирает «Добавить Python в свой PATH».

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

Как минимум, я бы сказал, что мы не должны добавлять в PATH больше , чем это делает базовая установка. Это означает, что даже если мы и сделаем это, мы не сделаем этого в Windows.

pradyunsg изменил заголовок Включить сценарии стандартной библиотеки в bin virtualenv / Включить сценарии стандартной библиотеки в сценарии virtualenv 2 часа назад

Просто отметим, что это небольшое изменение объема. ОП интересовался только 2to3 и, в частности, тем, что активация virtualenv не затеняла систему 2to3 . Я не могу комментировать, важно ли это (учитывая, что я утверждал, что этого не происходит в Windows, у меня нет соответствующего опыта работы с Unix, чтобы сказать, чувствую ли я, что это проблема). Но, не зная, какие другие сценарии являются «стандартными сценариями библиотеки», я не могу комментировать, является ли это важным моментом.

Хм, pyvenv , вероятно, является еще одним «сценарием стандартной библиотеки», и я почти уверен, что мы не хотим затенять системную версию той, которая запускает venv из среды virtualenv (поскольку это просто вызывает осложнения). без практической пользы).

ОП был ... заинтересован ... в частности, в том, что активация virtualenv не затмевает систему 2to3.

(Я не уверен, что эта фраза вкладывается в мои уста, ее можно интерпретировать двояко.)

Для ясности я прошу virtualenv создать прокладку для 2to3 .

(Позвольте мне отредактировать исходный пост с ожидаемым поведением, я вижу, что его пропуск вызывает путаницу.)

(Позвольте мне отредактировать исходный пост с ожидаемым поведением)

Сделанный. Я также пояснил, почему пользователь ожидал, что это будет PATH .

Я не уверен, что эта фраза кладет мне в рот

Извините за искажение ваших комментариев и спасибо за разъяснения! (Похоже, я правильно понял, о чем вы просили, я просто плохо переформулировал...)

Я также пояснил, почему пользователь ожидал, что он будет в PATH.

Ссылка, которую вы указали, немного сбивает с толку. У пользователя, кажется, есть процесс, который работает на trusty и xenial, но не на bionic. Мне непонятно, почему это так, если проблема в virtualenv. (Примечание: это отступление - независимо от того, очевидно, что virtualenv не копирует 2to3.py , поэтому обсуждение того, должны ли мы, имеет силу, даже если исходная проблема более тонкая).

Я прошу virtualenv создать прокладку для 2to3.

Обратите внимание, что мы никогда не будем создавать прокладку. Все, что нам нужно сделать, это скопировать скрипт 2to3.py . Если нужна прокладка (я думаю, это дело pyvenv), то этим займемся не мы.

Нет, все, что есть в Scripts, — это обертки точек входа для установленных библиотек (pip, easy_install и wheel в базовой установке).

Ооооооооооооо. Хорошо.

Просто отметим, что это небольшое изменение объема.

Я не думаю, что 2to3 — это особая снежинка — если мы добавим это, я ожидаю, что кто-то придет и спросит об остальных. Мы должны либо полностью это сделать, либо не делать вообще. Застрять на полпути — это не то, чего мы хотели бы здесь.

(Я ненавижу мобильный интерфейс)

Он «особенный» тем, что поддерживается стандартной библиотекой И находится в PATH для стандартной установки Linux.
Других подобных инструментов на самом деле не так много. Кроме 2to3 , это только pydoc , idle и pyvenv :

$ ls ~/.pyenv/versions/3.6.9/bin
2to3          easy_install-3.6  idle3.6  pip3.6  pydoc3.6  python3.6         python3.6m         python-config  virtualenv
2to3-3.6      idle              pip      pydoc   python    python3.6-config  python3.6m-config  pyvenv
easy_install  idle3             pip3     pydoc3  python3   python3.6-gdb.py  python3-config     pyvenv-3.6

(также python-config , который уже перенаправляется)

Ах, спасибо за разъяснение @native-api! Очень признателен. Наряду с объяснением @pfmoore того, что это проблема не в Windows, это помогает моему пониманию. :)

Я все еще сомневаюсь в том, чтобы включить его.

Кроме 2to3, это только pydoc, idle и pyvenv.

Мне было бы любопытно узнать, кто выбрал этот список. Это конкретно pyvenv? Ubuntu (bash в Windows и образ докера с установленным python3), по-видимому, не имеет 2to3 по умолчанию, хотя образ докера Python имеет те же двоичные файлы, которые вы упомянули (плюс pip, easy_install и колесо, которые приходят из установленных пакетов). Кажется, это немного зависит от дистрибутива :-( По крайней мере, список соответствующих двоичных файлов кажется последовательным.

Кстати, как я уже сказал выше, даже если мы внесем это изменение, я настоятельно рекомендую не включать pyvenv.

Ubuntu (bash в Windows и образ докера с установленным python3) по умолчанию не имеет 2to3

Это потому, что в Ubuntu 2to3 перемещен в отдельный пакет:

$ apt-file search 2to3 | grep -E '/2to3[^/]*$'
2to3: /usr/bin/2to3
<...>
python2.7: /usr/bin/2to3-2.7
<...>

Под «стандартной установкой Linux» я имел в виду логику, присущую сценарию сборки Linux Python, без вмешательства дистрибутивов — например, если вы устанавливаете из исходного кода (что и делает pyenv ).

Я мог бы взяться за это и постараюсь поработать над этим.

Обратите внимание, что это заменит наш текущий способ добавления pydoc как части сценария активации.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги