web-dev-qa-db-ja.com

出力を取得せずにコマンドを呼び出す方法

Pythonでは、subprocessを介してコマンドを呼び出すのに最も短く、標準的な方法ですが、その出力は気にしません。

私は試した subprocess.callしかし、出力を返すようです。私はそれを気にしません。出力が画面を乱雑にすることなく、プログラムを静かに実行するだけです。

それが役立つ場合、私はpdflatexを呼び出しており、私の意図は単にそれを呼び出すことです。

35
user225312
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# do something with out, err, or don't bother altogether.

基本的に、これはcmdsubprocessによって準備されたメモリ内バッファにstdoutとstderrに出力するものは何でも「パイプ」します。それらのバッファの内容をどうするかはあなた次第です。それらを調べることもできますし、まったく気にすることもありません。しかし、これらのバッファへのパイピングの副作用は、それらが端末に出力されないことです。

edit:これは、便利なメソッドcallでも機能します。デモ用:

>>> subprocess.call('ping 127.0.0.1')

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
0
>>> subprocess.call('ping 127.0.0.1', stdout=subprocess.PIPE)
0

edit-2subprocess.call

注:この機能では、stdout = PIPEまたはstderr = PIPEを使用しないでください。パイプは現在のプロセスで読み取られていないため、OSパイプバッファーをいっぱいにするのに十分な出力をパイプに生成すると、子プロセスがブロックする場合があります。

37
Santa

プロセスがメモリにバッファリングしたくない大量の出力を生成する場合、出力を電子ゴミ箱にリダイレクトする必要があります。

with open(os.devnull, "w") as f:
    subprocess.call(["pdflatex", filename], stdout=f)

変数os.devnullは、オペレーティングシステムのヌルデバイスの名前です(/dev/nullほとんどのOSではnul、もう1つでは)。

51
Sven Marnach

Unixを使用している場合は、/ dev/nullを使用します。シェルでコマンドを実行し、その出力を端末に表示したくない場合。

たとえば、次のようになります。-ls>/dev/nullは、端末に出力を生成しません。

そのため、os、subprocessを使用してシェルで何かを実行し、そのo/pを/ dev/nullに入れるだけです。

3

そのまま呼び出して、コマンドの最後に>/dev/nullを追加します。これにより、テキスト出力がリダイレクトされます。

3
Tyler Eaves