python - Python 的 subprocess.call() 和 Bash 流在语义上是否不同?

标签 python bash unix

来自bash:

$ python script.py < input.txt 2> stderr.txt > stdout.txt

在Python中:

import subprocess
subprocess.call(["python", "script.py"],
                stdin=open('input.txt', 'rb'),
                stdout=open('stdout.txt', 'wb'),
                stderr=open('stderr.txt', 'wb'))

假设有效的 input.txtpython 有效并且在路径等中,这些对于简单情况的行为是相同的。

是否存在 shell 版本的行为与 Python 版本不同的情况?

最佳答案

Are there any cases where the shell version could behave differently than the Python version?

这取决于您想要的效果。程序执行和流重定向在 shell 行中执行的操作与 Python 脚本中执行的操作完全相同。另一方面,shell 确实会对子进程进行一些其他更改,例如将其放入新的进程组并使其成为终端上的前台进程组。

编辑:就您的评论而言,存在差异,但至少流程组更改是我能立即想到的唯一差异。这确实是一个非常微小的差异,不执行相当高级作业控制的程序不会受到任何影响。至少内存限制或任何性能影响肯定没有变化。一般来说,至少不存在会影响绝大多数程序的差异。

当然,您也可以在 Python 中进行相同的进程组更改:请参阅 os.setpgid() 和 os.tcsetpgrp()。

关于python - Python 的 subprocess.call() 和 Bash 流在语义上是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29043333/

相关文章:

bash - 提示用户选择带有 bash 脚本的目录并读取结果

linux - 仅在 bash 脚本中检查可执行文件时计算文件夹和可执行文件?

c - popen 与 C 中的系统函数

python - 当我通过终端使用 VIM 时,我不断收到重复的文件,并在末尾附加了 ~。这些是什么?

c - 我用编译覆盖了我的 .c 文件。我能拿回来吗?

python - 计算负 yield 的投资组合权重的算法?

Python:模拟上下文管理器

linux - Home/End 键在 tmux 中不起作用

python - 将包含字典列表中两个不同值的相同键的字典的 json 列表中的值插入到 MYSQL 数据库

python - 从行值创建列并填充 - pandas