【问题标题】:what is the encoding of the subprocess module output in Python 2.7?Python 2.7 中 subprocess 模块输出的编码是什么?
【发布时间】:2015-05-10 13:23:06
【问题描述】:

我正在尝试在 64 位 windows vista 上使用 python2.7 检索压缩存档的内容。我尝试使用 subprocess 模块对 7zip(我最喜欢的存档管理器)进行系统调用:

# -*- coding: utf-8 -*-
import sys, os, subprocess

Extractor = r'C:\Program Files\7-Zip\7z.exe'
ArchiveName = r'C:\temp\bla.zip'
output = subprocess.Popen([Extractor,'l','-slt',ArchiveName],stdout=subprocess.PIPE).stdout.read()

只要存档内容仅包含 ascii 文件名,它就可以正常工作,但是当我尝试使用非 ascii 时,我得到一个编码的输出字符串变量,其中 ä、ë、ö、ü 已替换为 \x84、\x89 , \x94, \x81 (等等)。我已经尝试了各种解码/编码调用,但我对 python 太缺乏经验(而且通常太愚蠢)无法用变音符号重现原始字符(如果我想跟进这一步是必需的,例如提取子进程调用 7z)。

简单地说,我的问题是:我如何让它也适用于非 ascii 内容的档案?

...或者用更复杂的方式说:子进程的输出是否总是固定编码? 在前一种情况下 -> 它是哪种编码? 在后一种情况下 - >如何控制或揭示子进程输出的编码?受此博客上类似问题的启发,我尝试添加

import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

我也试过了

my_env = os.environ
my_env['PYTHONIOENCODING'] = 'utf-8'
output = subprocess.Popen([Extractor,'l','-slt',ArchiveName],stdout=subprocess.PIPE,env=my_env).stdout.read()

但似乎都没有改变输出变量的编码(或重现元音变音)。

【问题讨论】:

  • 在 Python 2 上读取子进程管道返回一个字节串——一个字节序列——没有编码。所以问题是 7z 使用什么字符编码来打印输出以及输出是否在 7z 和父 python 进程之间以某种方式损坏(在 Linux 上,每个字节都按原样传递,但 on Windows there could be some implicit conversion)。很清楚的是,更改sys.stdoutPYTHONIOENCODING 的编码在这里没有效果。
  • 不相关:使用subprocess.check_output() 获取命令的输出。
  • J.F.塞巴斯蒂安,感谢您的反应!实际上我的问题在 7z 之后仍然存在。为了测试,我创建了文件“blä.txt”。命令行中的“dir”打印“blä.txt”,但在 64 位 Windows 7 和 Vista 上的 python2.7 中使用subprocess.Popen(['dir',folder], … )check_output,我总是得到“bl\x84.txt”。 sys.stdoutPYTHONIOENCODING 的编码不会以任何方式影响我的输出……我做错了什么?这是由您提到的隐式 Windows 转换引起的(我该如何测试)?
  • ... 其实sys.stdout = codecs.getwriter(‘utf8’)(sys.stdout) 好像没有生效。即使在该命令 print sys.stdout.encoding 返回 None 之后。另外我的sys.stdout 没有isatty 方法……subprocess 问题可能是由我的sys 模块的潜在问题引起的吗?
  • 哇,这方法,比我预期的要复杂得多……感谢您耐心的解释,JF Sebastian! (顺便说一句,在 7z 中添加一个 –sccUTF-8 标志对该应用程序有很大帮助;“dir”我仍然不完全理解,但现在我可以忍受自己在这方面的无知:O)

标签: windows python-2.7 encoding subprocess


【解决方案1】:

您可以尝试使用 7zip 中的 -sccUTF-8 开关强制以 utf-8 格式输出。 这是参考页面:http://en.helpdoc-online.com/7-zip_9.20/source/cmdline/switches/scc.htm

【讨论】:

    猜你喜欢
    • 2019-05-24
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2015-04-04
    • 2017-09-12
    相关资源
    最近更新 更多