web-dev-qa-db-ja.com

Python os.system出力なし

私はこれを実行しています:

os.system("/etc/init.d/Apache2 restart")

必要に応じてWebサーバーを再起動します。ターミナルから直接コマンドを実行した場合と同様に、次のように出力します。

* Restarting web server Apache2 ...waiting [ OK ]

ただし、実際にアプリで出力する必要はありません。どうすれば無効にできますか?ありがとう!

23
user697108

os.system()は絶対に避け、代わりにサブプロセスを使用してください:

with open(os.devnull, 'wb') as devnull:
    subprocess.check_call(['/etc/init.d/Apache2', 'restart'], stdout=devnull, stderr=subprocess.STDOUT)

これは、/etc/init.d/Apache2 restart &> /dev/nullと同等のsubprocessです。

= subprocess.DEVNULL on Python 3.3 +

#!/usr/bin/env python3
from subprocess import DEVNULL, STDOUT, check_call

check_call(['/etc/init.d/Apache2', 'restart'], stdout=DEVNULL, stderr=STDOUT)
36
lunaryorn

あなたのOSに依存します(そしてそれがNoufalが言ったように、あなたは代わりにサブプロセスを使うべきです)あなたは次のようなことを試すことができます

 os.system("/etc/init.d/Apache restart > /dev/null")

または(エラーもミュートするには)

os.system("/etc/init.d/Apache restart > /dev/null 2>&1")
24
mb14

subprocessモジュールを使用して、stdoutおよびstderrを柔軟に制御できます。 os.systemは非推奨です。

subprocessモジュールを使用すると、実行中の外部プロセスを表すオブジェクトを作成できます。 stdout/stderrから読み取ったり、stdinに書き込んだり、シグナルを送信したり、終了したりできます。モジュールのメインオブジェクトはPopenです。呼び出しなどの他の便利なメソッドがたくさんあります。 docs は非常に包括的であり、 古い関数(os.systemを含む)の置換に関するセクション が含まれています。

21
Noufal Ibrahim

これは、数年前につなぎ合わせてさまざまなプロジェクトで使用したシステムコール関数です。コマンドからの出力がまったく必要ない場合は、out = syscmd(command)と言うだけで、outを使用して何も実行できません。

テスト済みで、Python 2.7.12および3.5.2で動作します。

def syscmd(cmd, encoding=''):
    """
    Runs a command on the system, waits for the command to finish, and then
    returns the text output of the command. If the command produces no text
    output, the command's return code will be returned instead.
    """
    p = Popen(cmd, Shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
        close_fds=True)
    p.wait()
    output = p.stdout.read()
    if len(output) > 1:
        if encoding: return output.decode(encoding)
        else: return output
    return p.returncode
0
jdgregson