Похоже, 2to3
в настоящее время не перенаправляется Virtualenv. См. https://travis-ci.community/t/2to3-command-not-found-in-virtualenv-in-bionic/4495 для случая, когда это было неожиданно для пользователя, поскольку обычно оно доступно на PATH
для установки Linux.
В свете того, что Py2 приближается к EOL, спрос на него будет расти!
$ 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
.
pip list
$ ~/.pyenv/versions/3.6.9/bin/python -m pip list
Package Version
---------- -------
pip 18.1
setuptools 40.6.2
virtualenv 16.7.2
Это все еще происходит после перефразирования 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 как части сценария активации.
Самый полезный комментарий
В качестве обходного пути вы можете использовать
python -m lib2to3
внутри вашей виртуальной среды с эквивалентной функциональностью.