You need to enable JavaScript to run this app. Python调用subprocess执行含perl处理的shell命令输出不全求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 20:27:04