web-dev-qa-db-ja.com

pythonスクリプトでbashコマンドを実行する方法

複数の引数を使用してbashコマンドを起動するにはどうすればよいですか(たとえば "Sudo apt update ")pythonスクリプトから?

16
Dremor

@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()
_
19
Anthon

コマンドを実行するためのパラメーター-cを指定して、bashをプログラムとして使用することができます。

例:

bashCommand = "Sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
8
Razor

subprocess モジュールはこれを行うように設計されています:

_import subprocess
subprocess.call(["Sudo", "apt", "update"])
_

コマンドが失敗した場合にスクリプトを終了する場合は、戻りコードを自分で解析する代わりに、check_call()を使用することを検討してください。

_subprocess.check_call(["Sudo", "apt", "update"])
_
7
Milind Dumbare

また、「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
2
ricardo130

サブプロセスモジュールを使用

import subprocess
command = 'Sudo apt update'
subprocess.check_call(command.split())
0
Fred

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")
0
apogoreliy