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
相关产品推荐
相关产品推荐

