【问题标题】:Cant use grep in subprocess command不能在子进程命令中使用 grep
【发布时间】:2018-07-03 07:14:38
【问题描述】:

我的子进程命令有问题,我想找出与“在线”行匹配的行。

def run_command(command):
    p = subprocess.Popen(command,shell=False,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)
    return iter(p.stdout.readline, b'')

command = 'mosquitto_sub -u example -P example -t ITT/# -v | grep "Online" '.split()
for line in run_command(command):
    print(line)

但我会得到一个错误

Error: Unknown option '|'.



Use 'mosquitto_sub --help' to see usage.

但是当使用 linux shell 运行时

user@server64:~/Pythoniscriptid$ mosquitto_sub -u example -P example  -t ITT/# -v | grep "Online"
ITT/C5/link Online
ITT/IoT/tester55/link Online
ITT/ESP32/TEST/link Online

我也尝试了shell = True,但没有成功,因为我会得到另一个错误,即无法识别主题ITT/#

Error: You must specify a topic to subscribe to.



Use 'mosquitto_sub --help' to see usage.

“可能的重复”根本没有帮助我,所以我认为我遇到了不同的问题。我试图将代码更改为此,没有得到任何回报

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,'')



command = 'mosquitto_sub -u example -P example -t ITT/# -v'.split()
command2 = 'grep Online'.split()

#subprocess.getoutput(command)

for line in run_command(command,command2):
    print(line)

【问题讨论】:

  • 尝试将executable="/bin/bash"添加到Popen
  • @Maroun 出现错误 /usr/bin/test:/usr/bin/test: 二进制无法启动
  • @joppich 我认为他有一个不同的问题
  • 我需要使用这个函数,因为我的输出字符串很长

标签: python grep subprocess


【解决方案1】:

当你拆分文本时,列表会是这样的

['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'',而不是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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多