subprocess.Popen使用相对路径

wim*_*wim 8 python subprocess path popen cwd

Popen 的文档提到你不能指定相对于'change working directory'kwarg的可执行路径.

如果cwd不是None,则子项的当前目录将在cwd执行之前更改为 .请注意,在搜索可执行文件时不考虑此目录,因此您无法指定程序相对于的路径cwd.

但是python在我的系统上的行为似乎直接与这种说法相矛盾:

wim@SDFA100461C:/tmp$ mkdir a
wim@SDFA100461C:/tmp$ cp /bin/ls /tmp/a/my_ls
wim@SDFA100461C:/tmp$ mkdir b
wim@SDFA100461C:/tmp$ touch /tmp/b/potato
wim@SDFA100461C:/tmp$ cd /home/wim
wim@SDFA100461C:~$ python
Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import check_output
>>> check_output(['../a/my_ls'], cwd='/tmp/b')
'potato\n'
>>> check_output(['../a/my_ls'])
OSError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

是否使用相对路径来cwd依赖于平台并且不应该依赖它?或者这是一个文档错误?

(这个问题从评论通过glglgl产卵这里)

Mar*_*ers 9

是的,这取决于平台.

在POSIX系统上,进程是分叉的,并且在os.chdir(cwd)执行可执行文件之前执行子进程a .

但是,在Windows上,使用CreateProcess()API调用并将cwd其作为lpCurrentDirectory参数传入.没有目录发生改变,并且CreateProcess()调用不会找咨询时,该参数lpApplicationName来执行.

为了使您的应用程序跨平台,在查找可执行文件时,不应该依赖当前工作目录进行更改.