【问题标题】:How to convert subprocess.communicate() to utf-8 String?如何将 subprocess.communicate() 转换为 utf-8 字符串?
【发布时间】:2020-06-15 13:41:50
【问题描述】:

我做了一个子进程,但是输出很奇怪:

(b'Ping: 3.425 ms\r\nDownload: 1167.08 Mbit/s\r\nUpload: 314.93 Mbit/s\r\n', None)

而我期待:

Ping: 3.425 ms
Download: 1167.08 Mbit/s
Upload: 314.93 Mbit/s

这是我的代码:

process = await asyncio.create_subprocess_exec("speedtest-cli", "--simple", stdout=asyncio.subprocess.PIPE)
output = await process.communicate()
print(output)

函数也必须是异步的。

【问题讨论】:

  • 希望你的真实用例不一样,因为这里asyncio没用。 speedtest-cli 在不同的进程中运行,所以subprocess.Popen 足以让两个进程并行运行。
  • 哦,是的。我将它用于 Discord Bot。当我为没有 asyncio 的 Speedtest 键入命令时,机器人不会响应其他命令。这就是它需要异步的原因。

标签: python python-3.x utf-8 subprocess


【解决方案1】:

如果你得到的输出是一个元组,你可以提取一个具有给定索引的元素:

>>> data = output[0]
b'Ping: 3.425 ms\r\nDownload: 1167.08 Mbit/s\r\nUpload: 314.93 Mbit/s\r\n'

您可以使用内置的.decode() 方法对其进行解码:

>>> data = output[0].decode("utf-8")
Ping: 3.425 ms
Download: 1167.08 Mbit/s
Upload: 314.93 Mbit/s

参考:

  • Process.communicate() - “返回一个元组 (stdout_data, stderr_data)”。
    您期望输出,因此是第一个元素,而您没有收到错误,因此是第二个元素。

【讨论】:

  • 我快速查看了这个库是否有一个encoding="utf-8" kwarg,就像普通的subprocess.run() 一样,它会自动解码所有输出。答案是:不。所以手动解码是唯一的方法。手册明确指出,这个 API 不像其他 Python 进程 API 那样工作:“所有其他关键字参数都传递给 subprocess.Popen 而不进行解释,除了 bufsize、universal_newlines、shell、文本、编码和错误,其中根本不应该指定。”
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 2013-08-20
  • 2010-09-21
  • 2012-07-02
  • 1970-01-01
  • 2010-11-03
相关资源
最近更新 更多