Popen的docs提到你不能指定相对于'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
使用与cwd
相关的路径是依赖于平台的,不应该依赖它吗?或者这是一个文档错误?
(这个问题来自glglgl here的评论)
答案 0 :(得分:8)
是的,这取决于平台。
在POSIX系统上,进程是分叉的,在子进程中,在执行可执行文件之前执行os.chdir(cwd)
。
在Windows上,使用CreateProcess()
API call并将cwd
作为lpCurrentDirectory
参数传入。在查找要执行的CreateProcess()
时,lpApplicationName
调用不会 调查该参数。
为了使您的应用程序保持跨平台,在查找可执行文件时,不应该依赖当前工作目录进行更改。