当您拆分文本时,列表将如下所示
['mosquitto_sub', ..., 'ITT/#', '-v', '|', 'grep', '"Online"']
当您将此列表传递给 subprocess.Popen 时,一个文字'|'
将是 mosquitto_sub 的参数之一。
如果你使用shell=True
,您必须转义任何特殊字符,例如#
在命令中,例如使用双引号:
import subprocess
command = 'echo -e "ITT/#\\ni am Online\\nbar Online\\nbaz" | grep "Online" '
p = subprocess.Popen(
command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, b''):
print(line)
或者,按照您所写的方式连接管道,但请确保迭代直到b''
, not u''
:
import subprocess
def run_command(command, command2):
p1 = subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
p2 = subprocess.Popen(command2,stdin=p1.stdout,stdout=subprocess.PIPE)
return iter(p2.stdout.readline, b'')
command = ['echo', '-e', 'ITT/#\\ni am Online\\nbar Online\\nbaz']
command2 = 'grep Online'.split()
for line in run_command(command,command2):
print(line)