【发布时间】:2019-06-17 22:16:57
【问题描述】:
我正在尝试在 Python 3 中执行几行 bash 并分别检查每一行的状态。
我首先尝试使用subprocess 中的gestatusoutput,但是每一行都在一个不与其他行通信的单独进程中运行(为了简单起见,给定的 MWE 包括设置一个变量,但是什么我打算在我的实际代码中做的比这更复杂——我知道os.environ 这个非常具体的例子):
from subprocess import getstatusoutput as cmd
stat, out = cmd("export TEST=1")
stat, out = cmd("echo $TEST")
将因此返回:
>>> print(out)
(0, "")
然后我尝试了以下方法:
cmdline = """export TEST=1
echo $TEST"""
stat, out = cmd(cmdline)
这可行,但迫使我解析输出,特别是如果我想检查第一个命令的状态(如果echo 有效,则cmd 返回的状态是0 无论之前发生什么),即不是很健壮。
我看到了一些使用Popen(仍然来自subprocess)的东西,但无法有效地使用它。
任何帮助将不胜感激!
【问题讨论】:
-
如果要执行多个命令并处理它们的所有输出,则需要对其进行解析。没有自动方法知道每个命令的输出在哪里结束。
-
您可以在每个命令之间添加
echo 'XXXXX'之类的内容,并将其用作分隔符。 -
在我看来,必须有一种方法可以使用相同的进程 ID,因此必须在一致的上下文中执行操作,而无需求助于解析输出。
-
或许可以考虑使用
pexpect,这样您就可以“控制”其他进程并响应其输出...pexpect.readthedocs.io/en/stable/index.html -
@MBR 你确定你需要使用 shell 命令吗?您可以在 shell 中执行的大多数操作也可以直接在 Python 中完成。你想做什么需要这种复杂的外壳处理?
标签: python python-3.x bash subprocess