python:os.system(r'cd foo')&os.chdir()

我有一个疑问。当我尝试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:')不工作? 我会很高兴得到一个帮助。

Solutions Collecting From Web of "python:os.system(r'cd foo')&os.chdir()"

os.system('F:')产生一个子shell进程(即%ComSpec% shell,通常是cmd.exe)并更改其工作目录。 它不(也不能)改变父进程的工作目录。

请注意,工作目录不是按每个线程存储的,即它不存储在线程环境块(TEB)中,而是存储在进程环境块(PEB)中的整个进程中。 通常避免修改多线程应用程序中的工作目录。 而是使用相对或完全合格的路径。


奖金琐事:DOS模拟

除了进程当前的工作目录之外,Windows(C运行时,实际上)还会在每个DOS驱动器(例如C :)中隐藏环境变量(如=C: :)来跟踪工作目录。 最初的'='字符使这些变量不被shell的set命令显示出来,而且还将它们从Python for os.environ的C运行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源代码,modulees / posixmodule.c,第1398行)。