используя мой системный 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 "$@"