我有一个使用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)
空间来自何处以及如何删除它们?
Windows工具输出格式以UTF-16编码.
您必须使用str.decode方法解码输出以纠正编码.引用文档:
str.decode([encoding[, errors]])
使用为编码注册的编解码器对字符串进行解码.encoding默认为默认字符串编码.可以给出错误以设置不同的错误处理方案.默认值为'strict',表示编码错误会引发UnicodeError.其他可能的值是'ignore','replace'以及通过codecs.register_error()注册的任何其他名称,请参阅Codec Base Classes部分.
a=p.stdout.read().decode('UTF16')
有关标准编码表,请参阅7.8.3.标准编码.
由于您的输出似乎具有混合编码[作为"空格"(实际上是0x00
字符,而不是0x20
仅存在于输出的一部分中),因此您可能需要在执行解码之前对字符串进行预处理或分区.