【问题标题】:Value of sys.path differs between windows and linux when setting up a virtual environmentwindows 和 linux 设置虚拟环境时 sys.path 的值不同
【发布时间】:2020-09-09 11:55:39
【问题描述】:

当通过python -m venv .venv 创建虚拟环境然后激活该环境时,我注意到在Windows 上,环境的根目录是sys.path 报告的导入路径的一部分,但对于Linux 则不是。

Python 版本:3.8.2

例子:

python -m venv .venv

在 Windows 上:

>>> import sys
>>> sys.path
['', 'c:\\temp\\.venv\\Scripts\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'c:\\temp\\.venv', 'c:\\temp\\.venv\\lib\\site-packages']
>>> sys.prefix
'c:\\temp\\.venv'

注意路径中的条目c:\\temp\\.venv

在 Linux 上:

>>> import sys
>>> sys.path
['', '/usr/local/lib/python38.zip', '/usr/local/lib/python3.8', '/usr/local/lib/python3.8/lib-dynload', '/carsten/.venv/lib/python3.8/site-packages']
>>> sys.prefix
'/carsten/.venv'

请注意,环境的根不是路径的一部分。

这是设计上的差异还是一个错误?

【问题讨论】:

  • @ErykSun,我查看了 C:\temp\.venv 内部,但没有找到 C:\temp\.venv 是如何进入 sys.path 的。
  • @ErykSun,没有。例如,我查看了activate.bat,但没有找到将C:\temp\.venv 放入sys.path 的任何内容。不知道我表达清楚了吗
  • @Philippe,这是导入站点模块的正常解释器启动顺序。使用-S 运行以跳过导入site.py,您将不再在列表中看到venv 前缀目录。在当前的 site.py 中,addsitepackages 调用 getsitepackages,如果路径分隔符是反斜杠(考虑到更好的可用方法,这是一种奇怪的识别 Windows 的方法),它首先添加 prefix,然后添加 os.path.join(prefix, libdir, "site-packages")
  • 谢谢你的解释,虽然我还是不明白。我想我需要通过您的 cmets(带有不同的链接)才能完全理解。
  • @ErykSun 非常感谢您的解释和对差异起源的解释。所以基本上就是这条线github.com/python/cpython/blob/master/Lib/site.py#L348

标签: python linux windows python-venv


【解决方案1】:

除了 site.py 添加的 venv 前缀目录外,Windows 案例还安装了前缀目录“C:\Python36”,由解释器启动代码添加。添加这些目录是很久以前的遗迹。没有令人信服的理由表明“C:\Python36”或“C:\temp\.venv”需要在sys.path 中。虽然某个地方的某个人可能依赖它。

添加在 1990 年代早期版本的 Windows 版本中用于生产的前缀目录,最初将标准库扩展模块放在前缀目录而不是专用的“DLLs”子目录中,此外它还使用前缀站点包的目录。例如,请参阅 1997 年 8 月 9 日的 site.py。在 Unix 中添加了几次迭代 later,“site-packages”,但 Windows 仍在使用前缀目录。

终于,几年后的2001-07-12,“site-packages”被添加到了 Python 2.2 的 Windows 版本中,但 另外 到了前缀目录中,而不是在 @987654327 中替换它@。这是由 Paul Moore(仍然是一位活跃的核心开发人员)在 PEP 250 中提出的,他指出保留前缀目录是为了支持在其中添加的 .pth 文件。

在 site.py 的当前实现中,addsitepackages 调用 getsitepackages,如果路径分隔符是反斜杠(鉴于可用的更好方法,这是一种奇怪的识别 Windows 的方法),它首先添加 prefix,然后os.path.join(prefix, libdir, "site-packages").

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多