python - 如何让 Popen 等待命令完成?

标签 python subprocess popen

目标是使用 Popen 在 bash shell 中启动命令,然后将该命令的输出传递给变量,但 Popen 应该等到命令完成后再继续,但这种情况不会发生。

我尝试使用 call 而不是 Popen,但是 call 除了退出代码之外不输出任何内容,这并不理想。 我也尝试使用 wait(),但出现错误。

var1 = Popen(["command | grep 'stuff' | cut -d 'delimiter' -f3"], 
             shell=True, stdout=PIPE,
             universal_newlines=True).communicate()[0].rstrip()
var2 = Popen(["command | grep 'stuff' | cut -d 'delimiter' -f1"], 
             shell=True, stdout=PIPE,
             universal_newlines=True).communicate()[0].rstrip()
print(var1 + var2)

Python 正确打印 var1,但不能正确打印 var2,后者为 None,因为由于命令未运行或不允许时间完成,因此未对它进行任何分配。 直接在终端上运行 var2 命令,就像在 python 程序中一样,会产生所需的结果,但是当 python 尝试运行它时,它只是跳过它并打印 var1 和 var2,但只显示 var1 字符串,var2 完全显示被忽略。

最佳答案

您必须将命令作为字符串传递,或者自己将其解析为标记。您需要使用 subprocess.run 而不是低级的 Popen。简单地说

var = subprocess.run("command | grep 'stuff' | cut -d 'delimiter' -f3", 
         shell=True, stdout=PIPE,
         universal_newlines=True).stdout

更好的解决方案是用 Python 代码替换 grepcut,并摆脱 shell=True 作为有用的奖励.

var = list()
output = subprocess.run(["command"], stdout=PIPE, universal_newlines=True)
for line in output.stdout.split('\n'):
    if 'stuff' in line:
        var.append(line.split('delimiter')[2])

关于python - 如何让 Popen 等待命令完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54044113/

相关文章:

python - 使用子进程在python 3中使用GPG加密文件

python - 如何在 Pandas 中找到哪个值计数 n 次?

Python 3.6.4 Arcade 模块窗口错误? {pyglet.gl.lib.GLException : b'invalid enumerant'}

python - 使用 else 子句处理异常

python - 终止使用 'subprocess.run' 创建的进程

python 文件不完整,如何等到它完成后再处理回父进程

python - 如何匹配字符串中的确切单词?

python - 在Python中运行更改(切换)用户的命令行脚本

Python - 从 Web 应用程序启动长时间运行的进程

python - 当标准输出没有输出时如何杀死 plink.exe?