2016-07-18 1 views
0

Linuxのbashシェルでは、コマンドを(ファイルから)読み込み、コマンドを実行してすべての出力、エラー、およびリターンコードをファイル。私は窓でPythonを使用してそれを行うことができます。すべての出力とエラーをキャプチャし、WindowsのコマンドをPythonで警告する

+1

それだけstdout' 'への書き込みを行う場合'stderr'を使用すると、もちろん' subprocess.Popen'を使うことができます。これらの標準ファイルを 'subprocess.PIPE'に設定します。 'Popen'インスタンスの' communicate'メソッドを呼び出します。しかし、\\。\ CONOUT $ 'を開いてコンソールに直接出力する場合は、コンソールの出力を[' ReadConsoleOutput'](https://msdn.microsoft.com/en-us/)で削り取る必要があります。ライブラリ/ ms684965)。 ['OutputDebugString'](https://msdn.microsoft.com/en-us/library/aa363362)を使用してデバッグメッセージを出力することもできます。その場合は、デバッガAPIを使用してこれらのメッセージを取得する必要があります。 – eryksun

+0

@eryksun、なぜコメント全体に答えを入れてもらえますか?あなたが書いたのは、試みられた答えです。そうすると、それを読んでいる人は混乱します。私はあなたが役に立つようにしようとしていると確信していますが、IMOはSOの有用性を低下させます。コメントにはマークダウンの書式もありません。そのため、例を含めると読みにくくなります。したがって、実際のコメントがある場合や質問を明確にする場合は、コメントフィールドを使用してください。それ以外の場合は、質問に答えてください。 –

+1

@CoreyGoldberg、それは完全な答えを書いている誰かを助けるかもしれないちょうどコメントです。私は、私が見ているほとんどの質問に対して満足のいく回答を書いて(そして維持して)いる時間がない。だから私は役に立つと思う少しの情報を提供するか、既存の回答をフィードバックして改善する。 – eryksun

答えて

0

もちろん可能です。これを行うには多くの方法があります。

各行にコマンドを含むcommandsという名前のテキストファイルがあるとします。

  • が結合された出力をキャプチャstdoutにsubprocess
  • リダイレクト標準エラー出力を使用してコマンドを実行し、ファイルから次のコマンド名を読み

    • 入力ファイルを開く:あなたはこのような何かを行うことができます
    • コマンドが成功した場合は戻りコードを0に設定し、そうでない場合はスローされた例外から戻りコードを取得します。
    • あなたが使用したいと思うでしょう

    をファイルにリターンコードと出力を書き込む: https://docs.python.org/2/library/subprocess.html または https://docs.python.org/3/library/subprocess.html

    例えば:

    import shlex 
    import subprocess 
    
    with open('commands.txt') as fin: 
        for command in fin: 
         try: 
          proc = subprocess.Popen(
           shlex.split(command), 
           stderr=subprocess.STDOUT, 
           stdout=subprocess.PIPE 
          ) 
          returncode = 0 
          output = proc.communicate()[0] 
         except subprocess.CalledProcessError as e: 
          returncode = e.returncode 
          output = e.output 
         with open('output.txt', 'w') as fout: 
          fout.write('{}, {}'.format(returncode, output)) 
    
  • +0

    Windowsで 'shlex.split'を使うことはお勧めしません。これは、POSIXシェル用のコマンドラインを分割するためのものです。すでにコマンドラインがある場合は、Windowsで直接コマンドラインを渡すことができます。それをリストに分割する必要はありません。 'subprocess.list2cmdline'はそれをコマンドラインに再構築するだけです。 – eryksun

    関連する問題