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

时间:2015-03-21 09:43:14

标签: windows python-3.x system 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:')无效? 我很乐意得到帮助。

1 个答案:

答案 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行)。