Mam skrypt Pythona, który używa podprocesu.Popen do wykonywania plików * .exe systemu Windows. Wszystkie EXE z wyjątkiem jednego dają oczekiwaną wydajność. Po wydrukowaniu za pomocą polecenia print() dane wyjściowe zawierają spacje między wszystkimi znakami wyjściowymi.Podproces Python wprowadza spacje
ten sposób wyjście wygląda podczas wykonywania EXE w wierszu poleceń Windows:
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
Jak to wygląda po wydrukowaniu w Pythonie:
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
Możemy wyraźnie zobaczyć spacje i co ciekawe, w pierwszych kilku liniach nie uwzględniono spacji.
Jest to kod:
p = subprocess.Popen('autorunsc.exe /accepteula', stderr=subprocess.STDOUT,
stdout=subprocess.PIPE, shell=True)
a=p.stdout.read()
print(a)
Skąd przestrzenie pochodzę i jak mogę je usunąć?
Najbardziej oczywistą odpowiedzią jest to, że jest wynikiem narzędzi Microsoftu wykorzystujących wewnętrznie UTF-16 zamiast UTF-8. –
Czy rzeczywiście są to przestrzenie ASCII 0x20, w przeciwieństwie do NUL-ów? Zaryzykowałbym to drugie. –
Co się dzieje, gdy zignorujesz 'stderr' (nie kieruję go do' STDOUT')? –