複数の引数を使用してbashコマンドを起動するにはどうすればよいですか(たとえば "Sudo apt update
")pythonスクリプトから?
@milneの答えは機能しますが、subprocess.call()
はほとんどフィードバックを提供しません。
Stdoutに出力された内容を分析できるように、subprocess.check_output()
を使用することをお勧めします。
_ 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()
_
コマンドを実行するためのパラメーター-cを指定して、bashをプログラムとして使用することができます。
例:
bashCommand = "Sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
subprocess モジュールはこれを行うように設計されています:
_import subprocess
subprocess.call(["Sudo", "apt", "update"])
_
コマンドが失敗した場合にスクリプトを終了する場合は、戻りコードを自分で解析する代わりに、check_call()
を使用することを検討してください。
_subprocess.check_call(["Sudo", "apt", "update"])
_
また、「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())
python 3.5以降では、次のように使用できます。
import subprocess
try:
result = subprocess.run("Sudo apt update", check=True, Shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
raise Exception(str(err.stderr.decode("utf-8")))
except Exception as err:
raise Exception(err)
else:
return result.stdout.decode("utf-8")