Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows python:os.system(r';cdfoo';)&;os.chdir()_Windows_Python 3.x_System_Chdir - Fatal编程技术网

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
而不是POSIX
chdir
的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'