Python で他の Python スクリプトを丸ごと実行するサンプルコードまとめておきます。
加えて、親となる Python のスクリプトから、子となる Python のスクリプトに値を渡す方法についてもまとめておきます。
以下の環境で動作確認をしています。
環境: Windows 10、Python 3.X
設定方法
① PC にフォルダを作ってテキストファイルを3つ作成し、main1.py、step1.py、step2.py という名前にしてください。main1.py が親で、子となる step1.py と step2.py を実行します。
② 作成した3つのファイルにそれぞれ、下記のサンプルコード1、2、3をコピー&ペーストして保存してください。
使い方
コマンドプロンプトから、main1.py を実行してください。
step1.py と step2.py が順に実行され、結果がコマンドプロンプトに表示されます(下記の「実行結果」参照)。
サンプルコードの説明
呼び出される側のスクリプトの準備
・ 先に、子となるスクリプト step1.py と step2.py を作っておきます。
・ step1.py は、単に “abc” という文字列を出力するだけの最も簡単なスクリプトです。
・ step2.py は、受け取った引数をそのまま表示するスクリプトです。
受け取った引数の個数は任意です。
呼び出す側のスクリプトの準備
・ つぎに、親となるスクリプトが main1.py を作ります。step1.py、step2.py を呼び出すためのスクリプトです。
・ main1.py では、まず、フォルダのパス path1 を取得します。
安全のため、実行するスクリプトはフルパスで指定しています。
・ つぎに、実行するコマンド cmd1 の文字列を作っています。
コマンドラインから Python スクリプトを実行するときのコマンド(python xx.py)をそのまま作っています。
・ 実行したいコマンド cmd1 を、subprocess.run( ) に入れると、実行できます。
Python スクリプト間での引数の渡し方
・ step2.py についても上記と同様です。
step2.py では、Python スクリプトに引数を渡したいので、cmd1 を定義している末尾に ” a b c” をつけて実行しています。引数としては、”a”、”b”、”c” の3つの文字列を渡しています。
・ 実行結果のところに示しましたが、main1.py を実行すると、step1.py がまず実行され、”abc” の文字列が表示されます。
つぎに、step2.py が実行されます。引数として “a”、”b”、”c” を渡したので、引数を含めたリスト(配列)が表示されます。配列の最初の要素は、step2.py のファイル名が入っており、つぎに引数の3つが入っていることがわかります。
step2.py を修正して、リストから使いたい引数を取り出せば、スクリプト間で文字列を渡して任意の処理を実行でき、プログラミングの自由度が広がります。なお、引数は文字列型となります。
Python スクリプトを繰り返し実行する方法、その他
・ Python のスクリプトを繰り返し実行したい場合は、上記の main1.py で、subprocess.run( … ) としているところを for ループで括れば可能です。
まとめ
Python スクリプトから、他の Python スクリプトを実行する方法についてまとめました。
動くスクリプトをいくつか作ったら、それらを呼び出す親のスクリプトを作成し、複雑な処理をさせることができるようになります。
Python のスクリプトを順次実行するだけであれば、バッチファイルを書いてしまっても同様のことができます。
なお、Python のスクリプトを丸ごと実行するのではなく、他のスクリプト内の関数をインポートして呼び出す方法など、以下の関連リンクにまとめていますので参考にしてみてください。
関連リンク
・ 他のスクリプトの関数を実行する 【Python】
・ バッチファイルで Anaconda から Python を実行する方法 【Windows 10】
サンプルコード1: step1.py
print( "abc" )
サンプルコード2: step2.py
import sys
print( sys.argv )
サンプルコード3: main1.py
import subprocess
import os
path1 = os.path.dirname(__file__) + "/"
file1 = path1 + "step1.py "
cmd1 = "python " + file1
subprocess.run( cmd1 )
file1 = path1 + "step2.py " + "a b c"
cmd1 = "python " + file1
subprocess.run( cmd1 )
実行結果
C:\...>python C:\...\main1.py
abc
['C:\\...\step2.py', 'a', 'b', 'c']