我在读取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]和许多其他输出,但我无法理解到底出了什么问题。
1条答案
按热度按时间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中执行相同的操作!