创建虚拟环境后,如果您有一个 shell 脚本调用:
/home/user/venv/python3 <scriptname>
它如何知道 virtualenv 的 site-packages 文件夹在哪里,而没有源激活到 virtualenv(从而改变路径)?
请您参考如下方法:
这种魔法发生在 sys.prefix 上.
Note: If a virtual environment is in effect, this value will be changed in
site.pyto point to the virtual environment. The value for the Python installation will still be available, viabase_prefix.
site 模块在解释器启动时被导入(从系统路径!),site-packages dirs are appended to sys.path with the sys.prefix .
您可以通过执行带有 -S 标志的 python REPL 来禁用导入站点模块来自己验证这一点。您会发现安装在 virtualenv 中的包不再通过 import 语句可见(假设它们尚未安装在系统站点包中)。
您的下一个问题可能是“但是站点本身如何知道我们是否在 venv 中?”答案是heuristic :
A virtual environment is a directory tree which contains Python executable files and other files which indicate that it is a virtual environment.
如果名为“pyvenv.cfg”的文件存在于 sys.executable 之上的一个目录中, sys.prefix 和 sys.exec_prefix 设置为该目录。已实现 here .
