Pythonコードからシェルスクリプトを呼び出す方法
サブプロセス モジュールがお手伝いします。
明らかに些細な例:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
ここでtest.sh
は単純なシェルスクリプトで、0
はこの実行に対する戻り値です。
os.popen()
(廃止予定)またはsubprocess
モジュール全体を使用する方法はいくつかありますが、 この方法
import os
os.system(command)
最も簡単なものの一つです。
シェルスクリプトにいくつかのパラメータを渡したい場合は、 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")
上記のようにサブプロセスモジュールを使用します。
私はこれをこんな風に使っています:
subprocess.call(["notepad"])
私はpython 3.5を実行しています、そしてsubprocess.call(['./ test.sh'])は私のために働きません。
私はあなたが3つの解決策をあなたが出力で何をしたいのかに依存してあげます。
1 - スクリプトを呼び出します。端末に出力が表示されます。出力は数値です。
import subprocess
output = subprocess.call(['test.sh'])
2 - 呼び出しを実行し、実行とエラーを文字列にダンプします。印刷しない限り(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.txtのエコーコマンドをtemp_fileにダンプします。
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 を見てください。
スクリプトに複数の引数がある場合
#!/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"
サブプロセスモジュールはサブプロセスを起動するための良いモジュールです。これを使ってシェルコマンドを呼び出すことができます。
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回実行して完了し、終了するまでブロックします。
サブプロセスは良いですが、一部の人々は scriptine を好むかもしれません。 Scriptineには、 Shell.call(args) 、 path.rename(new_name)のような、より高度なメソッドセットがあります。 および path.move(src、dst) 。 Scriptineは サブプロセス などに基づいています。
Scriptineの2つの欠点:
私はこれが古い質問であることを知っていますが、最近これにつまずいて、_-python 3.5以降に変更された Subprocess APIから誤解してしまいました。
外部スクリプトを実行する新しい方法は、run
関数を使用することです。
Import subprocess
subprocess.run(['./test.sh'])
シェルスクリプトファイルに実行権限がない場合は、次の方法で実行します。
import subprocess
subprocess.run(['/bin/bash', './test.sh'])