私はこれを実行しています:
os.system("/etc/init.d/Apache2 restart")
必要に応じてWebサーバーを再起動します。ターミナルから直接コマンドを実行した場合と同様に、次のように出力します。
* Restarting web server Apache2 ...
waiting [ OK ]
ただし、実際にアプリで出力する必要はありません。どうすれば無効にできますか?ありがとう!
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)
あなたのOSに依存します(そしてそれがNoufalが言ったように、あなたは代わりにサブプロセスを使うべきです)あなたは次のようなことを試すことができます
os.system("/etc/init.d/Apache restart > /dev/null")
または(エラーもミュートするには)
os.system("/etc/init.d/Apache restart > /dev/null 2>&1")
subprocess
モジュールを使用して、stdout
およびstderr
を柔軟に制御できます。 os.system
は非推奨です。
subprocess
モジュールを使用すると、実行中の外部プロセスを表すオブジェクトを作成できます。 stdout/stderrから読み取ったり、stdinに書き込んだり、シグナルを送信したり、終了したりできます。モジュールのメインオブジェクトはPopen
です。呼び出しなどの他の便利なメソッドがたくさんあります。 docs は非常に包括的であり、 古い関数(os.system
を含む)の置換に関するセクション が含まれています。
これは、数年前につなぎ合わせてさまざまなプロジェクトで使用したシステムコール関数です。コマンドからの出力がまったく必要ない場合は、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