#はじめに
Pythonで書いたコードが複数あり、それらの開始をとある一つのプログラムに制御させたい――
そんなときありますよね。
今回はプログラムの中から他の起動させたいプログラムを非同期で実行させる方法を紹介します。
環境
Windows10
python 3.7.6
anaconda 20.02
#今回のメインコード
import subprocess
command = [python (ファイル).py (引数)]
proc = subprocess.Popen(command) #->コマンドが実行される(処理の終了は待たない)
result = proc.communicate() #->終了を待つ
#コード例
何の捻りもないコードですが、とりあえず動くかのお試しで2つのファイルを作成しました。
call.pyでは与えた引数を出力するようにできています。
コマンドはスペース区切りで””で囲んでリストにします。
import sys
from time import sleep
sleep(1) #一秒寝てもらう(非同期になっているか確認のため)
args = sys.argv[1]
print(args)
import subprocess
command = ["python","call.py,"呼ばれた!"]
proc = subprocess.Popen(command)
print("呼び出し中")
proc.communicate()
先にmainの「呼び出し中」がprintされていることから、
subprocess.Popen()で実行した処理を待っていないことがわかります。
#処理時間について
subprocess.Popen()で呼び出すと処理時間が気になります。
1280×800の画像に対して、下記の処理を行うcall_2.pyを呼び出してみます。
from time import time
import numpy as np
import cv2
start = time()
img = cv2.imread("sample.png")
resize = cv2.resize(img,dsize=None,fx=0.5,fy=0.5) #resize
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(resize,kernel) #erode
cv2.imwrite("resize.png",erosion)
end = time() - start
print(end)
これでpython main.pyで実行した場合と、python call_2.pyで実行した場合の
printされるendの時間を比べてみました。
何度かコンソールを出入りして試しましたが、
処理時間はほぼ同じでした。
(実際の数字は実行環境に因るかと思いますので割愛)
#おわりに
subprocess.Popen()で別のpyファイルを実行する方法を紹介しました。
今回使用したプログラムでは処理速度に差は出ませんでした。
速度面でのネックがないのは嬉しいですね。
ただ、環境がLinuxとかだともしかしたらかわるかもしれません。
以上、ご参考になれば幸いです。
#参考資料
下記サイトも是非ご参考にしてください
公式ドキュメント(Python3.8.5)
実行したいファイルが別のディレクトリに存在する場合
Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ
subprocessでPythonからLinuxコマンド実行
参考になりそうな本(単に自分が読んでみたい…)
エキスパートPythonプログラミング改訂2版