簡體   English   中英

在Windows CMD中更改卷時sys.path中的奇怪行為

[英]Curious behavior in sys.path when changing volumes in Windows CMD

我剛剛注意到sys.path和Windows CMD的一些奇怪的行為,並想知道發生了什么以及為什么。

在以下兩個示例中,我打印出sys.path ,將卷更改為D: sys.pathcd更改為目錄,將卷更改回C:最后再次打印出sys.path 我用兩個非常相似的PYTHONPATH來做這件事。

使用PYTHONPATH=D:\\

C:\Users\z003w3we>python -c "import sys; print(sys.path)"
['', 'D:\\', <others>]

C:\Users\z003w3we>D:

D:\>cd UserData

D:\UserData>C:

C:\Users\z003w3we>python -c "import sys; print(sys.path)"
['', 'D:\\', <others>]

一切都如預期。

使用PYTHONPATH=D:注意缺少尾隨\\ ):

C:\Users\z003w3we>python -c "import sys; print(sys.path)"
['', 'D:\\', <others>]

C:\Users\z003w3we>D:

D:\>cd UserData

D:\UserData>C:

C:\Users\z003w3we>python -c "import sys; print(sys.path)"
['', 'D:\\UserData', <others>]

C:\Users\z003w3we>echo %PYTHONPATH%
D:

現在,我們突然在sys.path擁有D:\\UserData而不是D: . 請注意, PYTHONPATH沒有變化。

我無法使用PowerShell重現相同的行為; PYTHONPATH表現出了第一種行為。

正如我所說,我會非常有興趣了解這里發生的事情。

CMD為驅動器D:上的工作目錄設置一個名為“= D:”的常規隱藏環境變量。 Python進程繼承此環境變量,並且在調用GetFullPathNameW時,Windows API使用它來將驅動器相對路徑“D:”解析為完全限定路徑。

在CMD中,我們可以通過set“”列出所有環境變量,包括“隱藏”變量。 這個命令取決於一個bug,但是它存在了很長時間以至於它現在是一個特性。 要僅列出隱藏的,請使用set "" | findstr /r "^=" set "" | findstr /r "^=" 例如:

C:\>set "" | findstr /r "^="
=C:=C:\

C:\>cd /d E:\UserData
E:\UserData>c:

C:\>set "" | findstr /r "^="
=C:=C:\
=E:=E:\UserData

C:\>set PYTHONPATH=E:
C:\>python -c "import sys; print(sys.path[1]); sys.exit(0xFF)"
E:\UserData

C:\>set "" | findstr /r "^="
=C:=C:\
=E:=E:\UserData
=ExitCode=000000FF

暫無
暫無

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

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