繁体   English   中英

python3子进程output包含在b'\n'中

[英]python3 subprocess output enclosed in b' \n'

我正在尝试使用 python3 中的子进程模块来获取 MacOS 中 shell 命令的 output。

我正在使用的命令:

read_key = ["binary", "arg1", "arg2", "arg3"]
proc = subprocess.Popen(read_key, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我得到了不同的 output。

>>> proc.communicate()
(b'MY_EXPECTED_OUTPUT_STRING\n', b'')

>>> proc.communicate()[0]
b'MY_EXPECTED_OUTPUT_STRING\n'

>>> proc.communicate()[0].strip()
b'MY_EXPECTED_OUTPUT_STRING'
>>>

但我试图将“MY_EXPECTED_OUTPUT_STRING”放入一个变量(不带引号)。 是否有任何适当的子流程使用允许这样做? 或者我应该使用截断、grep 等来解决这个问题?

期待:

print(output)
    >>>>  MY_EXPECTED_OUTPUT_STRING

我这样做错了吗? 还可以帮助我阅读有关您已收藏的子流程模块的最简单但详细的文章:)

您的 output 是bytes格式,您可以将其解码为utf-8

proc.communicate()[0].strip().decode('utf-8')

默认情况下, subprocess.Popen将 output 流视为二进制(所以你得到bytes ,因此得到b'...' )。 (子进程可以打印出例如图像,这是二进制数据,您不希望它被破坏。)

您可以添加encoding参数让subprocess.Popen为您解码所有内容:

proc = subprocess.Popen(
    read_key,
    shell=False,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    encoding="utf-8",
)

UTF-8 通常是安全的默认值,除非您对子进程有更好的了解。

感谢@AKH 和 AnhPC03

我现在使用下面的代码:

read_key = ["binary", "arg1", "arg2", "arg3"]
proc = subprocess.Popen(read_key, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8')
output = proc.communicate()[0].strip()
print(output)
MY_EXPECTED_OUTPUT_STRING

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM