python - 使用 perl 进行格式化的 Python 子进程给出不完整的输出
问题描述
我在读取 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 是空白的,并且返回码是 0 符合预期。
我能找到的唯一解决方法是将 bash 输出重定向到文本文件,然后通过我不想使用的 python 读取文本文件,因为这是不必要的文件 IO。
我已经经历了Missing output from subprocess command、Python Subprocess Grep、Python subprocess run() 给出了异常输出 [duplicate]和许多其他问题,但我无法理解出了什么问题。
解决方案
你有一个报价问题。"""\1"""
意味着chr(0o1)
。要生成字符串\1
,您可以使用"""\\1"""
. 的其他实例也\
应该如此\\
。
由于\
需要转义所有实例,因此您也可以使用r"""\1"""
.
其他问题:
\1
无论如何,\2
在正则表达式之外都是错误的。您应该使用$1
and$2
。这里没有多行文字。
"..."
或者r"..."
就足够了。使用to cause将整个文件视为一行
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 做同样的事情!
推荐阅读
- c - 如何将内核模块与文件 .s GAS 程序集一起编译
- java - 我已经使用cordova从angular 6项目创建了android应用程序,无法调用任何api
- c# - 树莓派和PC之间的C#蓝牙连接
- git - Git submodule.$name.url 覆盖不起作用
- ansible - 如何在 Ansible 中使用 remote_src 复制多个文件?
- javascript - 如何在 Notiflix.Loading() 叠加层上添加按钮(关闭/停止)?
- ruby-on-rails - 如何在 RoR 上创建链接到另一个控制器的部分表
- c# - 来自 HttpClient 的 Web 请求卡住
- flutter - 无法从 Flutter Firebase 中的 DocumentReference 获取 DownloadURL 或 StorageReference
- c# - DELETE 方法似乎什么都不做