如何使Popen等待,以便命令完成?

时间:2019-01-04 18:15:33

标签: python subprocess popen

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

我尝试使用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,因为命令未运行或没有时间完成,因此未分配任何内容。 像在python程序中一样,直接在终端上运行var2命令会产生所需的结果,但是当python尝试运行它时,它只是跳过了它并显示var1和var2,但是只显示了var1字符串,因此var2完全忽略。

2 个答案:

答案 0 :(得分:0)

发生AttributeError: 'str' object has no attribute 'wait'错误是因为communicate()方法返回了(stdout, stderr)个字符串的元组。 wait()Popen对象本身的方法。如果您使用wait(),则无需呼叫communicate(),因为它将等待您。而且,如果您抛弃了对wait()对象的唯一引用,您就不能对其进行调用。{p>

也就是说,您真的需要使用Popengrep来完成这项工作吗?这样的事情可能会更快,并且不太可能包含安全漏洞:

cut

答案 1 :(得分:0)

您必须将命令作为字符串传递,或者自己将其解析为标记。您将要使用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])