【Python】subprocess.Popen()関数で他のプログラムを起動する

2020.05.25 /

【Python】subprocess.Popen()関数で他のプログラムを起動する

Pythonで他のプログラムを起動する方法について解説します。

エクセルやワードなどのOFFICEアプリだけでなく、メモ帳など様々なプログラムをPythonから起動できます。

例えば仕事で毎日起動する定番のアプリが起動する実行ファイル(スクリプト)を作っておいて、毎朝それをタスクスケジューラで起動するようにしておけば一つ一つ起動する手間が省けるようになりますね。

使うモジュールはsubprocessモジュール。その中のPopen()関数を使います。

今回紹介する方法を学べば、Windowsで指定したプログラムを一気に起動させるツールを作ることができるようになります。

それではPythonで他のプログラムを起動する方法について詳しく解説していきます。

subprocessモジュールとは

subprocessモジュールは、Pythonからコマンドを実行するためのモジュールです。

subprocessモジュールは標準モジュールのため、わざわざインストールする必要はありません。実行ファイルの先頭で以下のようにインポートすれば使えるようになります。

import subprocess

このsubprocessモジュールに似たものにcommandsというモジュールがあります。

しかし現在ではメンテナンスが止まっていますので、基本的にはcommandsではなく、subprocessを使いましょう。

subprocessモジュールにはPython3.5から追加されたrun()も存在します。
run()を使うことで外部コマンドを呼ぶことができます。

以下記事ではpingコマンドを実行して死活監視を行う方法について解説しております。

subprocess.Popen()とは

Pythonから他のプログラムを起動するのに、subprocessモジュールのPopen()関数を使います。

Popen()関数の最初の文字は大文字です。この「P」はprocess(プロセス)のpです。

つまりプロセスをオープンする関数ということです。

以下のように使います。

subprocess.Popen(プログラムファイル)

Popen()関数には起動したい外部プログラムのファイル名を渡します。

アプリのファイル名は、Windowsであれば、スタートメニューから該当のアプリを探し、その項目を右クリックし、「ファイルの場所を開く」を選択。エクスプローラーが開いたら、該当アプリのプログラムファイルを右クリックし、「プロパティ」を選択、ショートカットタブのリンク先がプログラムファイルのフルパスです。

上記の方法でPopenに渡すプログラムファイルのパスを得ることができますが、これってちょっとめんどくさいですよね。

なのでこの方法は忘れてください。もっと簡単にプログラムを起動する方法があります。

それが以下になります。

subprocess.Popen([‘start’, 開くファイル], shell=True)

これは「既定のアプリでファイルを開く」方法です。

.pdfファイルや.txtファイルをダブルクリックすると、決まったアプリが起動しますよね。この拡張子と関連付けられたアプリを既定のアプリと呼びます。

このダブルクリックでファイルを既定のアプリで開かせるコマンドがWindowsでは「start」、Macでは「open」、Ubuntuでは「see」です。

shell=TrueはWindowsのみ必要になります。

subprocess.Popen()の特徴

subprocess.Popen()関数には大きな特徴があります。

それは起動したプログラムの終了を待たないことです。

Popen()関数の戻り値Popenオブジェクトに対して使えるpoll()メソッドやwait()メソッドで終了したかの確認ができます。

poll()メソッドは、起動したプログラムが実行中かどうかを問い合わせします。

プロセスが実行していればNoneを返します。

>>> pro = subprocess.Popen(‘c:\\Windows\\Notepad.exe’)
>>> pro.poll() == None
True

wait()メソッドは、起動したプログラムが終了するのを待ちます。起動したプログラムが終了するまで、元の実行プログラムの動作を一旦止めたいとき等に使用します。

pro = subprocess.Popen(‘c:\\Windows\\Notepad.exe’)
pro.wait()

アプリを起動する

実際にファイルを起動するコードを書いてみます。

import subprocess
subprocess.Popen(['start', office54.xlsm], shell=True)

上記のサンプルコードでは、実行ファイルと同じ階層にあるoffice54.xlsmという名前のエクセルを起動するものです。

import subprocess
subprocess.Popen([‘explorer’, r'C:\’])

上記のサンプルコードはWindowsでエクスプローラーを起動するものです。

このように様々なアプリをsubprocess.Popen()関数を通して、Pythonから起動することができます。