小编典典

subprocess.Popen使用相对路径

python

Popen的文档提到您不能指定相对于“更改工作目录” kwarg的可执行路径。

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

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

/tmp$ mkdir a
/tmp$ cp /bin/ls /tmp/a/my_ls
/tmp$ mkdir b
/tmp$ touch /tmp/b/potato
/tmp$ cd /home/wim
~$ 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

是否在使用相对路径来cwd依赖于平台且不应依赖的东西?还是这是一个文档错误?


阅读 278

收藏
2021-01-20

共1个答案

小编典典

是的,这取决于平台。

在POSIX系统上,该过程是分叉的,并且在子进程os.chdir(cwd)中执行可执行程序之前先执行a 。

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

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

2021-01-20