子流程.Popen使用相对路径



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

如果cwd不是None,则子级的当前目录将更改为CCD_ 2请注意,此目录不是在搜索可执行文件时考虑,因此不能指定程序相对于CCD_ 3的路径

但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')
'potaton'
>>> check_output(['../a/my_ls'])
OSError: [Errno 2] No such file or directory

使用到cwd的相对路径是否依赖于平台,不应该依赖?或者这是一个文档错误?

(这个问题源于glglgl在这里的评论)

是的,这取决于平台。

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

但是,在Windows上,使用CreateProcess()API调用,并将cwd作为lpCurrentDirectory参数传入。不会发生目录更改,并且CreateProcess()调用在查找要执行的lpApplicationName时不会查阅该参数。

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

相关内容

  • 没有找到相关文章

最新更新