subprocess.Popen using relative paths(subprocess.Popen 使用相对路径)
问题描述
Popen 的 docs 提到你可以't 指定相对于更改工作目录"kwarg 的可执行路径.
The docs for Popen mention that you can't specify your executable path relative to the 'change working directory' kwarg.
如果cwd
不为None,则孩子的当前目录将变为cwd
在执行之前.注意这个目录不是搜索可执行文件时考虑,因此您不能指定程序相对于 cwd
的路径.
If
cwd
is not None, the child’s current directory will be changed tocwd
before it is executed. Note that this directory is not considered when searching the executable, so you can’t specify the program’s path relative tocwd
.
但是 python 在我的系统上的行为似乎直接与这个说法相矛盾:
But python's behaviour on my system seems to directly contradict this claim:
/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
'
>>> check_output(['../a/my_ls'])
OSError: [Errno 2] No such file or directory
使用 cwd
的相对路径是否依赖于平台且不应依赖?或者这是一个文档错误?
Is using relative paths to cwd
something that is platform dependent and shouldn't be relied upon? Or is this a documentation bug?
(这个问题来自 glglgl 这里的评论)
(this question spawns from a comment by glglgl here)
推荐答案
是的,这取决于平台.
在 POSIX 系统上,进程是分叉的,在子进程中,在执行可执行文件之前会执行 os.chdir(cwd)
.
On POSIX systems, the process is forked and in the child process a os.chdir(cwd)
is executed before executing the executable.
然而,在 Windows 上,CreateProcess()
API 调用 被使用,cwd
作为 lpCurrentDirectory
参数传入.不会发生目录更改,并且 CreateProcess()
调用在查找要执行的 lpApplicationName
时不会 参考该参数.
On Windows however, the CreateProcess()
API call is used and cwd
is passed in as the lpCurrentDirectory
parameter. No directory change takes place, and the CreateProcess()
call does not consult that parameter when looking for the lpApplicationName
to execute.
为了让您的应用程序跨平台,您在查找可执行文件时不应依赖于更改当前工作目录.
To keep your application cross-platform, you should not rely on the current working directory to be changed when looking up the executable.
这篇关于subprocess.Popen 使用相对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:subprocess.Popen 使用相对路径
基础教程推荐
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 筛选NumPy数组 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01