2016-01-11 6 views
8

私は、Windows * .exeファイルを実行するためにsubprocess.Popenを使用するpythonスクリプトを用意しました。 1つを除くすべてのEXEが期待される出力を生成します。 print()を使用して印刷すると、問題の出力には、出力のすべての文字の間の空白が含まれます。Pythonのサブプロセスに空白が導入されました

これは、WindowsのコマンドラインでEXEを実行するときに、出力がどのように見えるかです:

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 

我々は明らかに空白を見ることができると:これは、Pythonで印刷したときに、それがどのように見えるかです

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 

興味深いのは、最初の数行にスペースが含まれていないことです。

p = subprocess.Popen('autorunsc.exe /accepteula', stderr=subprocess.STDOUT, 
stdout=subprocess.PIPE, shell=True) 
a=p.stdout.read() 
print(a) 

スペースから来ないとどのように私はそれらを削除するには:

これは、コードのですか?

+3

最も可能性の高い答えは、内部的にUTF-8ではなくUTF-16を使用するMicrosoftツールの結果である可能性が最も高いと考えられます。 –

+0

NULではなく0x20のASCIIスペースですか?私は後者を危険にさらします。 –

+0

'stderr'を無視するとどうなりますか(' STDOUT'にルーティングしないでください) –

答えて

5

Windowsツールの出力形式は、UTF-16でエンコードされています。

str.decodeメソッドを使用してエンコードを修正するには、出力をデコードする必要があります。ドキュメントを引用:

str.decode([encoding[, errors]])

は、エンコードに登録されたコーデックを使用して文字列をデコードします。 はデフォルトの文字列エンコーディングにデフォルト設定されています。 異なるエラー処理スキームを設定するためにエラーが出される可能性があります。デフォルトは 'strict'です。つまり、 エンコードエラーによりUnicodeErrorが発生します。他の可能な値は、 'ignore'、 'replace'、 codecs.register_error()によって登録された他の名前です。コーデックベースクラスのセクションを参照してください。標準エンコーディングの表について

a=p.stdout.read().decode('UTF16') 

あなたは7.8.3. Standard Encodingsを参照することができます。

アウトプットの一部にしかエンコードされていないようです(実際には0x00文字で、0x20ではありません)ので、デコードを実行する前に文字列を前処理または分割することができます。

+0

これは機能します!出力に\ 0x00文字がありました。 .decode( 'UTF16')がトリックを行いました。出力の最初のチャンクは必要ありません。固定長であるため、必要なスライスだけを印刷します。ありがとう – user3138929

関連する問題