目标是使用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完全忽略。
答案 0 :(得分:0)
发生AttributeError: 'str' object has no attribute 'wait'
错误是因为communicate()
方法返回了(stdout, stderr)
个字符串的元组。 wait()
是Popen
对象本身的方法。如果您使用wait()
,则无需呼叫communicate()
,因为它将等待您。而且,如果您抛弃了对wait()
对象的唯一引用,您就不能对其进行调用。{p>
也就是说,您真的需要使用Popen
和grep
来完成这项工作吗?这样的事情可能会更快,并且不太可能包含安全漏洞:
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代码替换grep
和cut
,并摆脱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])