回答:
サブプロセスのモジュールは、あなたを助けます。
非常に些細な例:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
どこにtest.sh
簡単なシェルスクリプトで、0
この実行のために、その戻り値です。
chmod +x script.sh
ます。注:script.shはスクリプトのプレースホルダーです。適宜置き換えてください。
os.popen()
(非推奨)またはsubprocess
モジュール全体を使用するいくつかの方法がありますが、このアプローチ
import os
os.system(command)
最も簡単なのです。
subprocess
て、入力/出力/エラーパイプを管理できます。引数が多い場合にも優れています。引数の簡単なリストがあるためos.command()
、特殊文字をエスケープしてコマンドライン全体を作成する必要がsubprocess
あります。ただし、単純なタスクでos.command()
は十分な場合があります。
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
シェルスクリプトにいくつかのパラメーターを渡したい場合は、メソッドshlex.split()を使用できます。
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
test.sh
同じフォルダにあります:
#!/bin/sh
echo $1
echo $2
exit 0
出力:
$ python test.py
param1
param2
import os
import sys
test.shが実行するシェルスクリプトであると仮定します。
os.system("sh test.sh")
Python 3.5を実行していますが、subprocess.call(['./ test.sh'])が機能しません。
出力で何をしたいかに応じて、3つのソリューションを提供します。
1-スクリプトを呼び出します。端末に出力が表示されます。出力は数値です。
import subprocess
output = subprocess.call(['test.sh'])
2-実行とエラーを呼び出して文字列にダンプします。print(stdout)を実行しない限り、ターミナルでの実行は表示されません。Popenの引数としてのShell = Trueは私には機能しません。
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3-スクリプトを呼び出し、temp_fileにtemp.txtのエコーコマンドをダンプします
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
docサブプロセスを確認することを忘れないでください
サブプロセスモジュールは、サブプロセスを起動するのに適したモジュールです。これを使用して、次のようにシェルコマンドを呼び出すことができます。
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
スクリプトが.shファイルまたは長い文字列で記述されている場合は、os.systemモジュールを使用できます。それはかなりシンプルで簡単に呼び出すことができます:
import os
os.system("your command here")
# or
os.system('sh file.sh')
このコマンドは、スクリプトを1回実行して完了し、終了するまでブロックします。
スクリプトに複数の引数がある場合
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
出力にステータスコードが表示されます。スクリプトが正常に実行されると、0が返されます。それ以外の場合はゼロ以外の整数が返されます。
podname=xyz serial=1234
0
以下はtest.shシェルスクリプトです。
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
サブプロセスは良いですが、一部の人々はより良いスクリプトを好むかもしれません。Scriptineには、shell.call(args)、path.rename(new_name)、およびpath.move(src、dst)などのより高レベルのメソッドセットがあります。Scriptineはサブプロセスなどに基づいています。
Scriptineの2つの欠点:
私はこれが古い質問であることを知っていますが、最近この問題に遭遇し、Python 3.5以降に変更されたサブプロセス API から誤解してしまいました。
外部スクリプトを実行する新しい方法run
は、argsで記述されたコマンドを実行する関数を使用する方法です。コマンドが完了するのを待ってから、CompletedProcessインスタンスを返します。
import subprocess
subprocess.run(['./test.sh'])