python3.6 - TypeError: write() argument must be str, not bytes - but no files involved
python3.6 - TypeError: write() argument must be str, not bytes - but no files involved
以下代码 returns 一个错误,我不明白为什么...
运行 在 Python 3.6
import subprocess
import sys
import os
def execute_shell_cmd(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
for c in iter(lambda: process.stdout.read(1), b''):
sys.stdout.write(c)
for e in iter(lambda: process.stderr.read(1), b''):
sys.stderr.write(e)
execute_shell_cmd("ls -l")
返回错误:
TypeError: write() 参数必须是 str,而不是 bytes
我在网上看到的所有内容都在谈论文件并使用 'wb' 选项打开它们,但这与这里无关。
我确定这很傻...
有什么想法吗?
您在没有设置编码参数的情况下打开子进程,因此流是二进制流(这是一个非常合理的默认设置,考虑到例如 GhostScript 之类的东西可以在 stdout
上输出二进制 PDF)。
做
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
encoding='utf-8',
errors='strict', # could be ignore or replace too, `strict` is the default
)
如果您希望将流包装在 UTF-8 解码器中,以便从中获取字符串,而不是字节。当然,这意味着您知道输出数据始终是 UTF-8。
以下代码 returns 一个错误,我不明白为什么... 运行 在 Python 3.6
import subprocess
import sys
import os
def execute_shell_cmd(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
for c in iter(lambda: process.stdout.read(1), b''):
sys.stdout.write(c)
for e in iter(lambda: process.stderr.read(1), b''):
sys.stderr.write(e)
execute_shell_cmd("ls -l")
返回错误: TypeError: write() 参数必须是 str,而不是 bytes
我在网上看到的所有内容都在谈论文件并使用 'wb' 选项打开它们,但这与这里无关。
我确定这很傻... 有什么想法吗?
您在没有设置编码参数的情况下打开子进程,因此流是二进制流(这是一个非常合理的默认设置,考虑到例如 GhostScript 之类的东西可以在 stdout
上输出二进制 PDF)。
做
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
encoding='utf-8',
errors='strict', # could be ignore or replace too, `strict` is the default
)
如果您希望将流包装在 UTF-8 解码器中,以便从中获取字符串,而不是字节。当然,这意味着您知道输出数据始终是 UTF-8。