Pythonで外部プログラム、プロセス、アプリといったものを実行するための方法を書いておきます。
スクリプト言語らしく、わりと簡単な記述で実行することができます。
いつも定型的に立ち上げるプログラムをまとめて実行したりや、繰り返し実行、自動実行したりなどの実行制御も当然できますし、やはり便利です。
(シェルの方が簡潔に記述できるという場合もありますが、Pythonの方が言語仕様が便利ですし、WindowsだけでなくMacでもLinuxでも学んだ文法が活用できるのが良いなと私は思っています)
対象読者として、ある程度は、PC操作やプログラミングの用語や雰囲気が分かる方向けに書いてます。(パス、エスケープ、シェル、コマンドの意味が分かれば十分です)
ただし、初心者向けで、ちょっとPythonからプログラム(プロセス)を呼び出せるようになったら楽だなと考えている人向けに書いてます。
私の環境は、Windows10、Pythonのバージョンは3.6で行いました。
目次
Pythonで外部プログラム、プロセス、アプリを起動実行する方法
Pythonで外部プログラム、プロセス、アプリケーションを起動するには、Pythonの標準ライブラリに入っているsubprocessモジュールを使います。
(この記事ではプログラム≒プロセス≒アプリケーションということで使用します)
この記事では基本的なことに絞って書きますので、より詳しいことを知りたい人は、公式ドキュメントを参照してください。
subprocess — サブプロセス管理【Pythonドキュメント】
Pythonで外部プログラムを実行する方法【run関数】
公式ではrun関数の使用を推奨されています。
サブプロセスを起動する推奨手段は、すべての用法を扱える
run()
関数を使用することです。より高度な用法では下層のPopen
インターフェースを直接使用することもできます。
run関数で単にプログラムを呼び出して実行する方法
ただ単にプログラムを呼び出したいときは以下のように使います。
- import subprocess # import文なので次以降の例では省略します
- subprocess.run(“C:\Program Files (x86)\sakura\sakura.exe”)
第一引数:実行ファイルパスの文字列。
run関数でプログラムで開きたいファイルを指定して実行する方法
プログラムで開きたいファイルを指定するときは、次のように書きます。
- subprocess.run([r”C:\Program Files (x86)\sakura\sakura.exe”,r”C:\Users\TARO\Documents\test.txt”])
第一引数:リストもしくはタプル。[実行ファイルパスの文字列,開きたいファイルパスの文字列]を渡します。
また、パスを引数に取るときは、文字列の前に「r」を付けるようにしておきましょう。row文字列と言って、エスケープ文字列を無効にしてくれます。
「r」を付けないとSyntaxError: (unicode error) ‘unicodeescape’と怒られると思います。
run関数でプログラムの終了待機をせずに実行する方法
今まで紹介したrun関数の書き方でプロセスを実行すると、呼び出されたプロセスが終了するまで待機するようになっています。
これは、それぞれのプロセスを順番に実行したいなどの制御をする際には便利ですが……、PCのログイン時に普段使っているプログラムを次々と起動させていきたいだけといったときには、不便です。
(こういう場合はPopenを使用した方がよいかなと)
run関数でプログラムの終了待機をせずに実行する方法としては、シェルを挟む方法があります。(シェルとはwindowsではコマンドプロンプトやPowerShellのこと)
以下のように記述します。
- subprocess.run(r”start notepad.exe C:\Users\TARO\Desktop\プログラミング\python_test.txt”,shell=True)
- subprocess.run([r”start”,r”C:\Program Files (x86)\sakura\sakura.exe”, r”C:\Users\TARO\Desktop\プログラミング\python_test.txt”],shell=True)
この方法は、シェルで使用するコマンドでプログラムを呼び出す方法なので、普段から利用している人は慣れていると思います。
1行目の例の場合
第一引数:シェルコマンドの文字列。
第二引数:shell=True。シェルの使用を設定。
2行目の例の場合
第一引数:シェルコマンドを半角スペースの部分で区切った文字列のリストもしくはタプル
第二引数:shell=True。シェルの使用を設定。
上記2つの例の違いは、2点あります。
環境変数にパスが通してあれば実行ファイル(ここではexe)の記述が短く済むということ。
コマンドの引数に、例の「Program Files (x86)」のように半角スペースがあるときは、文字列ではなく、リストもしくはタプルが第一引数とすること。
(これは面倒くさいです……)
run関数を使用しておけば、基本的なことはできるのですが、少し簡単に記述できる他の方法も紹介しておきます。
Pythonで外部プログラムを実行する方法【Popen】
使い方は、run関数と似ています。
Popenで単にプログラムを呼び出して実行する方法
- subprocess.Popen(“C:\Program Files (x86)\sakura\sakura.exe”)
第一引数:実行ファイルパスの文字列。
Popenでプログラムで開きたいファイルを指定して実行する方法
- subprocess.Popen([r””C:\Program Files (x86)\sakura\sakura.exe”,r”C:\Users\TARO\Documents\test.txt”])
第一引数:リストもしくはタプル。[実行ファイルパスの文字列,開きたいファイルパスの文字列]を渡します。
Popenの場合は、プロセスの終了を待機しないので、次々とプログラムを実行することができます。わざわざシェルを挟む必要がありません。
(シェルを挟んだ使用も run関数と同様にできます)
高度な用法でなくとも、Popenの方が簡潔に記述できる場合、Popenを使えば良いんじゃないかなと思います。