You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Shell脚本后,如何打印stdout单行而非单个字符?

解决subprocess获取stdout后仅输出单个字符的问题

我来帮你搞定这个问题!你现在遇到的情况是因为Python 3中subprocess的communicate()返回的stdout是字节串(bytes类型),你用stdout[1]其实是取这个字节数组里的第二个字节,自然只会输出单个字符啦。

要打印stdout里的单行内容,你需要先把字节串解码成普通字符串,再按行处理就行,下面给你两种常见的解决方案:

方案1:直接打印全部stdout内容(包含所有行)

如果你的脚本输出有多行,直接解码后打印就能正常显示所有内容:

pr = subprocess.Popen(args=['./check.sh'], bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(stdout, stderr) = pr.communicate(input=None)
# 将字节串解码为UTF-8格式的字符串(如果脚本用其他编码,替换成对应编码比如gbk)
stdout_str = stdout.decode('utf-8')
# 打印全部输出内容
print(stdout_str)

方案2:打印指定单行(比如第一行)

如果你只需要输出某一行,比如脚本的第一行输出,可以用splitlines()把字符串按行分割,再取对应的索引:

pr = subprocess.Popen(args=['./check.sh'], bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(stdout, stderr) = pr.communicate(input=None)
stdout_str = stdout.decode('utf-8')
# 按行分割成列表
output_lines = stdout_str.splitlines()
# 先判断列表不为空,避免索引越界报错
if output_lines:
    # 取第一行(索引从0开始),如果要第二行就用output_lines[1]
    print(output_lines[0])

小提示

  • 如果你的shell脚本输出用的不是UTF-8编码,记得把decode()里的参数改成对应的编码(比如Windows下可能是gbk)。
  • 另外,shell=True虽然方便,但如果命令来自不可信输入会有安全风险,要是你的脚本路径是固定的,也可以考虑去掉shell=True,把参数写成args=['./check.sh'](原代码其实已经这么写了,没问题)。

内容的提问来源于stack exchange,提问作者spiderman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:39