создание символической ссылки на интерпретатор python в virtualenv путается с PYTHONPATH - PullRequest
1 голос
/ 08 января 2020

используя мой системный python интерпретатор (в Ubuntu 18.04) у меня настроено следующее PYTHONPATH:

$ python3 -c "import sys; print(sys.version); print(sys.path)"
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', 
 '/usr/lib/python3.6/lib-dynload', 
 '/usr/local/lib/python3.6/dist-packages', 
 '/usr/lib/python3/dist-packages']

создание символической ссылки на интерпретатор python не влияет на PYTHONPATH:

$ cd ~/tmp
$ ln -rs /usr/bin/python3
$ ./python3 -c "import sys; print(sys.version); print(sys.path)"
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', 
 '/usr/lib/python3.6/lib-dynload', 
 '/usr/local/lib/python3.6/dist-packages', 
 '/usr/lib/python3/dist-packages']

создание virtualenv и выполнение того же самого дает разные результаты, хотя (здесь я использую --copies, иначе символическая ссылка с ln -sr будет ссылаться непосредственно на системный интерпретатор):

$ python3 -m venv virtualenv --copies
$ # making sure python3 is no symlink
$ ls -go virtualenv/bin/python3
-rwxr-xr-x 1 4526456 Jan  8 08:11 virtualenv/bin/python3
$ ./virtualenv/bin/python3  -c "import sys; print(sys.version); print(sys.path)"
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', 
 '/usr/lib/python3.6/lib-dynload', 
 '/home/user/tmp/virtualenv/lib/python3.6/site-packages']

до здесь все как положено. теперь:

$ rm python3
$ ln -sr virtualenv/bin/python3 
$ ./python3 -c "import sys; print(sys.version); print(sys.path)"
3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0]
['', '/usr/lib/python36.zip', '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload', 
 '/usr/local/lib/python3.6/dist-packages', 
 '/usr/lib/python3/dist-packages']

, где '/home/user/tmp/virtualenv/lib/python3.6/site-packages' (что в сущности является целой точкой virtualenv) ушел - вместо этого оригинальный /usr/lib/python3/dist-packages вернулся.

символическая ссылка на другие исполняемые файлы в virtualenv работает:

$ ln -sr virtualenv/bin/pip3
$ ./pip3 install mypy         # works!
$ ln -sr virtualenv/bin/mypy
$ ./mypy                      # works!

я знаю, что обычный способ работать с virtualenv - это $ source virtualenv/bin/activate. но, увидев, что символическая ссылка работает для exjectutables в virtualenv/bin/, я разочаровываюсь, что она не работает для самого интерпретатора python.

есть ли способ, которым я могу это исправить? (Конечно, я мог бы использовать bash скрипт, который запускает правильный интерпретатор и передает все аргументы. Но я чувствую, что символическая ссылка должна быть возможной ...).


мой текущий обходной путь для на данный момент это bash скрипт с +/- содержанием:

#!/bin/bash

HERE=$(dirname $(readlink -f $BASH_SOURCE))
${HERE}/my_symlink_dir/python3 "$@"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...