python子进程给出了不完整的输出

30byixjq  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(474)

我在读取python子进程命令的输出时遇到问题。
我要从其输出读取的bash命令:

pacmd list-sink-inputs | tr '\n' '\r' | perl -pe 's/ *index: ([0-9]+).+?application\.process\.id = "([^\r]+)"\r.+?(?=index:|$)/\2:\1\r/g' | tr '\r' '\n'

当我通过bash运行此命令时,我得到了预期的输出:

4 sink input(s) available.
6249:72
20341:84
20344:86
20350:87

当我试图通过python的子进程获取其输出时,运行以下任一进程: subprocess.Popen(cmnd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].decode('UTF-8') check_output(cmnd,shell=True).decode('UTF-8') subprocess.run(cmnd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode('utf-8') 哪里 cmnd = """pacmd list-sink-inputs | tr '\n' '\r' | perl -pe 's/ *index: ([0-9]+).+?application\.process\.id = "([^\r]+)"\r.+?(?=index:|$)/\2:\1\r/g' | tr '\r' '\n'""" 它给出以下输出: '4 sink input(s) available.\n\x02:\x01\n\x02:\x01\n\x02:\x01\n\x02:\x01\n' 这是无意的,因为它没有我想要的6249:72等数字。即使stderr也是空的,returncode也是0。
我能找到的唯一解决办法是将bash输出重定向到一个文本文件,然后通过python读取该文本文件,我不想使用它,因为这是不必要的文件io。
我已经讨论过subprocess命令、python subprocess grep、python subprocess run()提供异常输出[duplicate]和许多其他输出,但我无法理解到底出了什么问题。

4ioopgfo

4ioopgfo1#

你有一个报价问题。 """\1""" 方法 chr(0o1) . 出弦 \1 ,你可以用 """\\1""" . 其他的例子 \ 应该是 \\
由于 \ 如果需要逃跑,你也可以使用 r"""\1""" .
其他问题: \1\2 在正则表达式之外,无论如何都是错误的。你应该使用 $1$2 .
这里不需要多行文字。 "..."r"..." 就够了。
整体 tr 可以通过使用 -0777 引起 perl 将整个文件视为一行。
这给了我们: cmnd = "pacmd list-sink-inputs | perl -0777pe's/ *index: (\\d+).+?application\\.process\\.id = "([^\\n]+)"\\n.+?(?=index:|$)/$2:$1\\n/sag'"cmnd = r"pacmd list-sink-inputs | perl -0777pe's/ *index: (\d+).+?application\.process\.id = "([^\n]+)"\n.+?(?=index:|$)/$2:$1\n/sag'" 但是为什么这里要使用perl呢?您可以轻松地在python中执行相同的操作!

相关问题