web-dev-qa-db-ja.com

Pythonコードからシェルスクリプトを呼び出す方法

Pythonコードからシェルスクリプトを呼び出す方法

173
u449355

サブプロセス モジュールがお手伝いします。

明らかに些細な例:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

ここでtest.shは単純なシェルスクリプトで、0はこの実行に対する戻り値です。

207
Manoj Govindan

os.popen()(廃止予定)またはsubprocessモジュール全体を使用する方法はいくつかありますが、 この方法

import os
os.system(command)

最も簡単なものの一つです。

80
Michał Niklas

シェルスクリプトにいくつかのパラメータを渡したい場合は、 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
36
import os
import sys

Test.shが実行したいシェルスクリプトであると仮定します。

os.system("sh test.sh")
16

上記のようにサブプロセスモジュールを使用します。

私はこれをこんな風に使っています:

subprocess.call(["notepad"])
13
hugo24

私は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 を見てください。

12
lauralacarra

スクリプトに複数の引数がある場合

#!/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"
4
Rishi Bansal

サブプロセスモジュールはサブプロセスを起動するための良いモジュールです。これを使ってシェルコマンドを呼び出すことができます。

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回実行して完了し、終了するまでブロックします。

3
Ankit Singh

サブプロセスは良いですが、一部の人々は scriptine を好むかもしれません。 Scriptineには、 Shell.call(args)path.rename(new_name)のような、より高度なメソッドセットがあります。 および path.move(src、dst) 。 Scriptineは サブプロセス などに基づいています。

Scriptineの2つの欠点:

  • 現在の文書化レベルは、それが十分であってもより包括的になるでしょう。
  • サブプロセスとは異なり、scriptineパッケージは現在デフォルトでインストールされていません。
2
Akseli Palén

私はこれが古い質問であることを知っていますが、最近これにつまずいて、_-python 3.5以降に変更された Subprocess APIから誤解してしまいました。

外部スクリプトを実行する新しい方法は、run関数を使用することです。

Import subprocess

subprocess.run(['./test.sh'])

シェルスクリプトファイルに実行権限がない場合は、次の方法で実行します。

import subprocess
subprocess.run(['/bin/bash', './test.sh'])
0
thomasXu