Python调用subprocess执行含perl处理的shell命令输出不全求助
问题原因
- 你在Python中定义
cmnd时使用了普通多行字符串,Perl替换逻辑中的\1、\2属于反斜杠转义序列,会被Python直接解析为ASCII控制字符(\1对应SOH字符、\2对应STX字符,也就是你输出中看到的\x01、\x02),最终传递给Shell执行的命令已经和你预期的原始命令不一致。
修复方案
两种方案任选其一即可:
方案1:使用原始字符串定义命令
在字符串前加r标记,告诉Python不要处理字符串内的反斜杠转义,所有字符原样传递:
# 注意字符串前加了r cmnd = r"""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'"""
方案2:手动转义反斜杠
把Perl语句中所有的\替换为\\,让Python解析后仍能保留\1、\2的原始含义:
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'"""
验证方法
修改前可以打印cmnd的原始内容,能看到\1、\2已经变成了不可见的控制字符,修改后打印可以确认\1、\2被原样保留。修改后再使用你原有的任意一种subprocess调用方式,都能得到预期输出,不需要额外写入文件。
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

