1

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

4

1 回答 1

1

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

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


额外琐事:DOS 仿真

除了进程当前的工作目录之外,Windows(实际上是 C 运行时)在隐藏的环境变量中跟踪每个 DOS 驱动器(例如 C:)上的工作目录,例如=C:. 最初的 '=' 字符使这些变量不会被 shell 的set命令显示出来,它还会将它们从environPython 用于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的 Windows 程序chdir不会记住每个驱动器的工作目录。Python 在 Windows 上的本土实现chdir必须实现这种魔力。参见win32_chdir(3.4.3 源代码,Modules/posixmodule.c,第 1398 行)。

于 2015-03-22T16:20:58.947 回答