[英]Curious behavior in sys.path when changing volumes in Windows CMD
我刚刚注意到sys.path
和Windows CMD的一些奇怪的行为,并想知道发生了什么以及为什么。
在以下两个示例中,我打印出sys.path
,将卷更改为D:
sys.path
将cd
更改为目录,将卷更改回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.