我有一个疑问。当我尝试os.system(r'cd F:\')
时,我仍然在我启动解释器的目录中。但是`os.chdir()'工作正常。我将在下面显示我的代码:
>>> import os
>>> os.system('F:')
0
通过运行os.system('dir')
我发现我还在目录C:\ python34中。
然后我尝试了这个:
>>> os.chdir('F:')
通过运行os.system('dir')
,我发现它运行正常。
为什么os.system('F:')
无效?
我很乐意得到帮助。
答案 0 :(得分:1)
os.system('F:')
生成一个子shell进程(即%ComSpec%
shell,通常是cmd.exe)并更改其工作目录。它不会(也不能)更改父进程的工作目录。
请注意,每个线程不存储工作目录,即它不存储在线程环境块(TEB)中,而是存储在进程环境块(PEB)中的进程范围内。通常避免在多线程应用程序中修改工作目录。而是使用相对或完全限定的路径。
奖金琐事:DOS仿真
除了进程当前工作目录之外,Windows(实际上是C运行时)跟踪隐藏环境变量(如=C:
)中每个DOS驱动器(例如C :)上的工作目录。最初的' =' character保持这些变量不被shell的set
命令显示,它还将它们从Python用于environ
的C运行时os.environ
中过滤掉。如果将空字符串传递给set
命令,则命令提示符中的错误将显示这些隐藏变量,例如set ""
。或者在Python中使用ctypes来调用GetEnvironmentVariable
:
>>> from ctypes import *
>>> kernel32 = WinDLL('kernel32')
>>> kernel32.GetEnvironmentVariableW('=C:', None, 0)
8
>>> path = create_unicode_buffer(8)
>>> kernel32.GetEnvironmentVariableW('=C:', path, 8)
7
>>> path.value
'C:\\Temp'
Windows 使用这些隐藏变量(如果存在)来解析驱动器相对路径。也就是说,C运行时_chdir
函数实际上是创建/修改它们的函数。只调用SetCurrentDirectory
而不是POSIX chdir
的Windows程序不会记住每个驱动器的工作目录。 Python在Windows上的本地实现chdir
必须实现这种魔力。参见win32_chdir
(3.4.3 source,Modules / posixmodule.c,第1398行)。