Windows python:os.system(r';cdfoo';)&;os.chdir()
我有点怀疑。当我尝试Windows python:os.system(r';cdfoo';)&;os.chdir(),windows,python-3.x,system,chdir,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(r'cd F:\')
时,我仍然在启动解释器的目录中。但是'os.chdir()'工作正常。我将在下面显示我的代码:
>>> import os
>>> os.system('F:')
0
通过运行os.system('dir')
我发现我仍然在目录C:\python34中
然后我试了一下:
>>> os.chdir('F:')
通过运行os.system('dir')
我发现它工作得很好
为什么操作系统('F:')不工作?
我很乐意获得帮助。os.system('F:')
生成一个子shell进程(即%ComSpec%
shell,通常为cmd.exe)并更改其工作目录。它不会(也不能)更改父进程的工作目录
请注意,工作目录不是按线程存储的,即它不是存储在线程环境块(TEB)中,而是存储在进程环境块(PEB)中的进程范围内。通常避免在多线程应用程序中修改工作目录。而是使用相对或完全限定路径
奖金琐事:DOS仿真 除了进程当前工作目录外,Windows(实际上是C运行时)还跟踪每个DOS驱动器(例如C:)上隐藏的环境变量中的工作目录,例如
=C:
。初始的“=”字符防止shell的set
命令显示这些变量,它还将这些变量从Python用于os.environ
的C运行时environ
中过滤出来。如果将空字符串传递给set
命令,则命令提示符中的错误将显示这些隐藏变量,例如set”“
。或者在Python中,使用ctypes调用:
Windows使用这些隐藏变量(如果存在)解析驱动器相对路径。也就是说,C运行时函数实际上是创建/修改它们的函数。仅调用
SetCurrentDirectory
而不是POSIXchdir
的Windows程序不会记住每个驱动器的工作目录。Python在Windows上自行开发的chdir
实现必须实现这一魔力。请参阅(3.4.3源代码,Modules/posixmodule.c,第1398行)。你们中的任何人都可以将其作为答案而不是评论发布。这将非常有用。
>>> 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'