python - 在 Windows CMD 中更改卷时 sys.path 中的奇怪行为
问题描述
我刚刚注意到sys.path
Windows CMD 的一些奇怪行为,想知道发生了什么以及为什么。
在以下两个示例中,我打印出sys.path
,将音量更改为D:
,cd
进入目录,将音量更改回C:
,最后sys.path
再次打印出来。我用两个非常相似PYTHONPATH
的 s 来做这个。
与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:
现在,D:
我们突然有了D:\UserData
,而不是sys.path
。注意那PYTHONPATH
是不变的。
我无法使用 PowerShell 重现相同的行为;两者都PYTHONPATH
表现出第一个行为。
正如我所说,我会对了解这里发生的事情非常感兴趣。
解决方案
CMD 为驱动器 D: 上的工作目录设置了一个名为“=D:”的传统隐藏环境变量。Python 进程继承此环境变量,Windows API 在GetFullPathNameW
调用时使用它来将驱动器相对路径“D:”解析为完全限定路径。
在 CMD 中,我们可以通过 set "" 列出所有环境变量,包括“隐藏”的变量。这个命令依赖于一个错误,但它已经存在了很长时间,以至于它现在是一个特性。要仅列出隐藏的,请使用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
推荐阅读
- cplex - 如何使用 Cplex 控制 pyomo 中的打印级别
- javascript - 如何向使用特定命令的每个人发送消息?- 不和谐.js
- wordpress - 当要比较的元数据是序列化数组时,Wordpress meta_query meta_value 一个值数组?
- c++ - C++ 是否以空值终止 std::string?
- tensorflow - 在 TensorFlow 中实现本地响应归一化的问题
- sql-server - 如何在 Superset SQL Lab 中禁用 SQL 包装器?
- flutter - ios 上的颤振下载器和路径提供程序
- node.js - 如何在 mongo DB 中使用查找
- reactjs - 做出反应。仅当 N 时间过去而没有 onChange 时才在 onChange 内触发函数
- node.js - 我如何通过互联网控制 Nodejs 服务器应用程序