0

プロセスを起動して and を取得しstdoutたいstderr。これをリアルタイムで取得することはあまり気にしません。

subprocess.check_ouput()を使用したかったのです、プロセスが失敗する可能性があります。StackOverflow と Python docs を読んだ後、try .. catchブロックを追加しました。

def execute(cmd,timeinsec=60):
  print("execute ",cmd, " with time out ",timeinsec)
  try:
    output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, timeout=timeinsec,universal_newlines=True)
  except subprocess.TimeoutExpired:
    print("timeout expired")
    return "",2
  except subprocess.CalledProcessError:
    print("called process failed")
    return "",1
  print ('The command returned the following back to python:'+output)
  return output,0

しかし、出力を印刷すると、出力 output.decode('utf-8') の最初の行が得られます。

注:これは、Windows上のMsysgit 1.8で配布されたMSys環境で実行しています。

何が間違っている可能性があるか考えていますか?これを行うためのより良い方法を知っていますか?

4

2 に答える 2

2

を使用している必要があります。それに応じて質問にタグを付けてください。また、なぜread()のメソッドを呼び出しているのかわかりませんoutput。はバイト文字列outputであり、メソッドはありません。次のコードは私のために働きます:read()

#! /usr/bin/env python3
import subprocess

try :
    retcode = 0
    cmd = ["/bin/ls", "/usr/local"]
    output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    output = e.output
    retcode = e.returncode

print(output.decode('utf-8'))
print(retcode)

出力は次のとおりです。

bin
etc
games
include
lib
man
sbin
share
src

0

/usr/local(存在し/usr/localfooない)に置き換えることでエラーをトリガーすると、出力は次のようになります。

/bin/ls: cannot access /usr/localfoo: No such file or directory

2

universal_newlines=True最後に、 callに追加でき、出力でのcheck_output()呼び出しについて心配する必要はありません。decode()

...
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT,universal_newlines=True)
...
...
print(output)

上記の例を見て、問題を再現できるかどうかを確認してください。問題を再現できる場合は、コード、その出力、およびすべてのエラーメッセージ(SOのコピー、貼り付け、および再フォーマット)を投稿してください。

于 2013-03-19T21:03:21.103 に答える
0

解決

問題は、サブプロセスで起動されたウィンドウ内のアプリケーションがコンソール (Visual を使用して構築) を割り当てていて、プロセスの stdout が既に外部にリダイレクトされており、このリダイレクトの前に元の cout で 1 つの印刷のみが行われたことでした。

于 2013-03-20T10:41:15.327 に答える