use*_*036 9 python encoding subprocess popen python-3.x
在Windows上使用Python 3.4.3.
我的脚本在控制台中运行一个小程序,应该得到输出:
import subprocess
p1 = subprocess.Popen([ ... ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
out, err = p1.communicate(str.encode("utf-8"))
Run Code Online (Sandbox Code Playgroud)
这导致正常
'UnicodeDecodeError:'charmap'编解码器无法解码位置135的字节0x9d:字符映射到<undefined>'.
现在我想忽略错误:
out, err = p1.communicate(str.encode(encoding="utf-8", errors="ignore"))
Run Code Online (Sandbox Code Playgroud)
这导致了一个更有趣的错误,我发现没有帮助使用谷歌:
TypeError:'str'对象的描述符'encode'需要一个参数
所以似乎python甚至不知道str.encode(...)的参数是什么.当你省略错误部分时同样适用.
jfs*_*jfs 15
universal_newlines=True启用文本模式.结合使用stdout=PIPE,它强制解码子进程的输出,使用locale.getpreferredencoding(False)的不是Windows上的utf-8.这就是你看到的原因UnicodeDecodeError.
要使用utf-8编码读取子进程的输出,请删除universal_newlines=True:
#!/usr/bin/env python3
from subprocess import Popen, PIPE
with Popen(r'C:\path\to\program.exe "arg 1" "arg 2"',
stdout=PIPE, stderr=PIPE) as p:
output, errors = p.communicate()
lines = output.decode('utf-8').splitlines()
Run Code Online (Sandbox Code Playgroud)
str.encode("utf-8")相当于"utf-8".encode().没有必要将它传递给.communicate()除非你设置stdin=PIPE并且子进程期望b'utf-8'bytestring作为输入.
str.encode(encoding="utf-8", errors="ignore)有形式klass.method(**kwargs)..encode()期望self(一个字符串对象),这就是你看到的原因TypeError.
>>> str.encode("abc", encoding="utf-8", errors="ignore") #XXX don't do it
b'abc'
>>> "abc".encode(encoding="utf-8", errors="ignore")
b'abc'
Run Code Online (Sandbox Code Playgroud)
不要klass.method(obj)在obj.method()没有充分理由的情况下使用.
| 归档时间: |
|
| 查看次数: |
24315 次 |
| 最近记录: |