我有一个使用subprocess.Popen执行Windows * .exe文件的python脚本。除一个之外的所有EXE产生预期输出。当使用print()打印时,有问题的输出包括输出的每个字符之间的空格。
这是在Windows命令行中执行EXE时输出的外观:
C:\Python27>autorunsc.exe /accepteula
Sysinternals Autoruns v13.51 - Autostart program viewer
Copyright (C) 2002-2015 Mark Russinovich
Sysinternals - www.sysinternals.com
HKLM\System\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\StartupPrograms
rdpclip
rdpclip
RDP Clip Monitor
Microsoft Corporation
6.1.7601.17514
c:\windows\system32\rdpclip.exe
20/11/2010 11:22
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
C:\Windows\system32\userinit.exe
这是用Python打印时的外观:
Sysinternals Autoruns v13.51 - Autostart program viewer
Copyright (C) 2002-2015 Mark Russinovich
Sysinternals - www.sysinternals.com
H K L M \ S y s t e m \ C u r r e n t C o n t r o l S e t \ C o n t r o l \
r m i n a l S e r v e r \ W d s \ r d p w d \ S t a r t u p P r o g r a m
r d p c l i p
r d p c l i p
R D P C l i p M o n i t o r
M i c r o s o f t C o r p o r a t i o n
6 . 1 . 7 6 0 1 . 1 7 5 1 4
c : \ w i n d o w s \ s y s t e m 3 2 \ r d p c l i p . e x e
2 0 / 1 1 / 2 0 1 0 1 1 : 2 2
H K L M \ S O F T W A R E \ M i c r o s o f t \ W i n d o w s N T \ C u r
n t V e r s i o n \ W i n l o g o n \ U s e r i n i t
我们可以清楚地看到空白,有趣的是前几行不包含空格。
这是代码:
p = subprocess.Popen('autorunsc.exe /accepteula', stderr=subprocess.STDOUT,
stdout=subprocess.PIPE, shell=True)
a=p.stdout.read()
print(a)
空间来自何处以及如何删除它们?
答案 0 :(得分:5)
Windows工具输出格式以UTF-16编码。
您必须使用str.decode方法解码输出以纠正编码。引用文档:
str.decode([encoding[, errors]])
使用为编码注册的编解码器对字符串进行解码。编码 默认为默认字符串编码。可以给出设置a的错误 不同的错误处理方案。默认为'strict',意思是 编码错误引发UnicodeError。其他可能的值是 'ignore','replace'以及通过注册的任何其他名称 codecs.register_error(),请参阅Codec Base Classes部分。
a=p.stdout.read().decode('UTF16')
对于标准编码表,您可以参考7.8.3. Standard Encodings。
由于您的输出似乎具有混合编码[作为“空格”(实际为0x00
个字符,而不是0x20
)仅存在于输出的一部分],您可能需要预处理或分区执行解码之前的字符串。