如何正确地为 Python 解释器创建符号 link?
How to correctly create a symbolic link to the Python interpreter?
在 Ubuntu 18.04 上,我在 /home/sss/dev/venv/3.7
安装了 Python 3.7 和一个虚拟环境 venv 站点包在 /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
接下来,我在主目录中创建了一个符号 link,目标是虚拟环境中的 Python 解释器 -
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
但是当我用这个 link 代替 /home/sss/dev/venv/3.7/bin/python
时,我希望它可以访问 /home/sss/dev/venv/3.7/lib/python3.7/site-packages
中的包,但事实并非如此 -
./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
是否有解决此问题的方法?
我认为这行不通。 py
的位置很重要。为了考虑到 虚拟环境 ,py
会在相对于其自身的位置查找一些特定文件。例如,它会查找 ../pyvenv.cfg
,如果找不到该文件,则虚拟环境将被完全忽略(在这种情况下它是否处于活动状态并不重要)。我相信 py
必须在虚拟环境的 bin
目录中,而不是其他任何地方。
不确定初衷是什么,但也许你可以写一个 py
shell 包装器 而不是符号 link ,例如下面的(只是一个例子,它可能需要改进才能真正有用):
#!/usr/bin/env sh
/home/sss/dev/venv/3.7/bin/python "$@"
这样的脚本可以放在任何地方,它总是会考虑虚拟环境。
在 Ubuntu 18.04 上,我在 /home/sss/dev/venv/3.7
安装了 Python 3.7 和一个虚拟环境 venv 站点包在 /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
接下来,我在主目录中创建了一个符号 link,目标是虚拟环境中的 Python 解释器 -
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
但是当我用这个 link 代替 /home/sss/dev/venv/3.7/bin/python
时,我希望它可以访问 /home/sss/dev/venv/3.7/lib/python3.7/site-packages
中的包,但事实并非如此 -
./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
是否有解决此问题的方法?
我认为这行不通。 py
的位置很重要。为了考虑到 虚拟环境 ,py
会在相对于其自身的位置查找一些特定文件。例如,它会查找 ../pyvenv.cfg
,如果找不到该文件,则虚拟环境将被完全忽略(在这种情况下它是否处于活动状态并不重要)。我相信 py
必须在虚拟环境的 bin
目录中,而不是其他任何地方。
不确定初衷是什么,但也许你可以写一个 py
shell 包装器 而不是符号 link ,例如下面的(只是一个例子,它可能需要改进才能真正有用):
#!/usr/bin/env sh
/home/sss/dev/venv/3.7/bin/python "$@"
这样的脚本可以放在任何地方,它总是会考虑虚拟环境。