簡體   English   中英

設置虛擬環境時,sys.path 的值在 windows 和 linux 之間有所不同

[英]Value of sys.path differs between windows and linux when setting up a virtual environment

通過python -m venv.venv創建虛擬環境然后激活此環境時,我注意到在 Windows 上,環境的根目錄是sys.path報告的導入路徑的一部分,但對於 ZE206A54E97690CCE50CC872Z70EE 它不是。

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'

請注意,環境的根不是路徑的一部分。

這是設計上的差異還是這是一個錯誤?

除了 site.py 添加的 venv 前綴目錄外,Windows 案例還安裝了解釋器啟動代碼添加的前綴目錄“C:\Python36”。 添加這些目錄是很久以前的遺跡。 沒有令人信服的理由表明 "C:\Python36" 或 "C:\temp\.venv" 需要在sys.path中。 盡管某個地方的某個人可能依賴它。

在 1990 年代的 Windows 版本的早期版本中添加前綴目錄曾經是有效的,最初將標准庫擴展模塊放在前綴目錄而不是專用的“DLLs”子目錄中,此外它還使用前綴目錄作為站點包。 例如,參見 1997-08-09 的site.py。 幾次迭代之后,在 Unix 中添加了“site-packages”,但 Windows 仍然使用前綴目錄。

最后,幾年后的2001-07-12 ,“site-packages”被添加到 Python 2.2 的 Windows 版本中,但除了前綴目錄,而不是在sys.path中替換它。 這是由 Paul Moore(仍然是活躍的核心開發人員)在PEP 250中提出的,他指出保留前綴目錄是為了支持在其中添加的 support.pth 文件。

在當前的 site.py 實現中, addsitepackages調用getsitepackages ,如果路徑分隔符是反斜杠(鑒於可用的更好方法,這是一種識別 Windows 的奇怪方法),它首先添加prefix ,然后添加os.path.join(prefix, libdir, "site-packages")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM