简体   繁体   中英

How to correctly create a symbolic link to the Python interpreter?

On Ubuntu 18.04, I installed Python 3.7 and a virtual environment in /home/sss/dev/venv/3.7 The venv site packages are in /home/sss/dev/venv/3.7/lib/python3.7/site-packages -

~/dev/venv/3.7/bin/python -m site
sys.path = [
    '/home/sss/dev',
    '/usr/lib/python37.zip',
    '/usr/lib/python3.7',
    '/usr/lib/python3.7/lib-dynload',
    '/home/sss/dev/venv/3.7/lib/python3.7/site-packages',
]
USER_BASE: '/home/shane/.local' (exists)
USER_SITE: '/home/shane/.local/lib/python3.7/site-packages' (exists)
ENABLE_USER_SITE: False

Next, I created a symbolic link in my home directory targeting the Python interpreter in the virtual environment -

ln -s /home/sss/dev/venv/3.7/bin/python ~/py
ls -l  py
lrwxrwxrwx 1 sss sss 35 feb  5 08:52 py -> /home/sss/dev/venv/3.7/bin/python

but when I use this link in place of /home/sss/dev/venv/3.7/bin/python , I would expect it to have access to packages in /home/sss/dev/venv/3.7/lib/python3.7/site-packages , but this is not the case -

./py -m site
sys.path = [
    '/home/sss/dev',
    '/usr/lib/python37.zip',
    '/usr/lib/python3.7',
    '/usr/lib/python3.7/lib-dynload',
    '/home/sss/.local/lib/python3.7/site-packages',
    '/usr/local/lib/python3.7/dist-packages',
    '/usr/lib/python3/dist-packages',
]
USER_BASE: '/home/sss/.local' (exists)
USER_SITE: '/home/sss/.local/lib/python3.7/site-packages' (exists)
ENABLE_USER_SITE: True

Is there a work-around to this problem?

I believe this can't work. The location of py matters. In order to take into account the virtual environment , py would look for some specific files at locations relative to its own. For example it would look for ../pyvenv.cfg and if it can't find that file then the virtual environment is completely ignored (whether it is active or not doesn't matter in such a case). I believe py has to be in the virtual environment's bin directory and nowhere else.


Not sure exactly what the original intention is, but maybe you could write a py shell wrapper instead of a symbolic link, such as the following (just an example, it probably needs to be improved to be really useful):

#!/usr/bin/env sh

/home/sss/dev/venv/3.7/bin/python "$@"

Such a script could be placed anywhere and it would always take the virtual environment into account.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM