回答:
@milneの答えは機能しsubprocess.call()
ますが、フィードバックはほとんどありません。
subprocess.check_output()
stdoutに出力された内容を分析できるように、使用することを好みます。
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
呼び出されたコマンドのゼロ終了時にエラーをスローします
してください、これは起動しないことに注意してくださいbash
または別のシェルを指定しない場合はshell
関数にキーワード引数を(同じことが当てはまりますsubprocess.call()
、そしてあなたはそれがセキュリティ上の危険を強いるよう必要はありませんが、必要がない場合)、それが直接起動しますコマンド。
Pythonから多くの(異なる)コマンド呼び出しを実行していることに気付いた場合は、plumbumを調べてください。それにより、より読みやすい(IMO)を行うことができます。
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
またはos.system
)を使用することをお勧めしますres = os.popen('sudo apt update').read()
。例:?@Anthon
subprocess
がos.system
、os.popen
すでに存在します。このようなPEPは受け入れられるのは簡単なことではありません。いくつかの人々は、あなたや私が今まで意志よりもはるかに多くのことを考えて与えています。そして、subprocess
2003年以降改善されている、他の人は、下位互換性のためだけ残っています。あなたが赤の持っているos.system
マニュアルページ:subprocessモジュールは、新しいプロセスを生成し、その結果を取得するためのより強力な機能を提供します。そのモジュールを使用してこの機能を使用することが好ましいです。
sudo
はそれをより厳しくするだけです。たぶんpython-aptを使用する方がより良い解決策です(私はそれを自分で調べたことはありません)。
サブプロセスモジュールは、これを行うために設計されています。
import subprocess
subprocess.call(["sudo", "apt", "update"])
コマンドが失敗した場合に終了するスクリプトをご希望の場合は、使用して検討するかもしれないcheck_call()
代わりに、戻りコードを自分で解析します:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(私はメインOSとしてFedoraのを使用していて、私はyumを使用しています)
subprocess.call()
ブロックされてsubprocess.Popen()
いる
また、「os.popen」を使用できます。
例:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
出力:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
サブプロセスモジュールを使用
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())