Python & Selenium を PyInstaller で実行ファイル化するまとめ
Python で Selenium を使ったプログラムを PyInstaller で実行ファイル化する自分用まとめです。 …
公開日:
Python & Seleniumで作成したプログラムを実行形式(.exe)にします。
特に今回は一つのexeファイルにすることにします。
PyInstallerを使うのが簡単なのですが、そのままではWebDriver(この記事ではchromedriver.exeを使用)をexe内に含んでくれません。exe内に含んでくれないということは、実行ファイルを配布する際、WebDriverも一緒に配布しないといけません。これが嫌なのでexeに内包する方法を調べました。
PyInstallerの基本的な使い方は以下のページで解説しています。
PyInstallerを使うときに次の2点に注意すれば大丈夫です。
前提として次のフォルダ構成とします。
MyProj/
├ driver/
│ └ chromedriver.exe
└ main.py
PyInstallerで実行形式にするのですが、オプションとして--add-binary
をつけます。これはPython以外のバイナリファイル(今回はchromedriver.exe)をexeに含めたい場合に指定します。
次のコマンドを使用します(パスの部分はそれぞれ書き換えてください)。
pyinstaller ./main.py --onefile --noconsole --add-binary "./driver/chromedriver.exe;./driver"
"元ファイルパス;取込先ファイルパス"
です。--add-binary
オプションの指定方法がちょっと分かりにくいですが、まずは--onefile
オプションなしでビルドしてみるとわかりやすいです。--onefile
オプションなしでビルドすると複数のファイルに分かれて出力されます。
例えば以下のようになります。
dist/
└ main/
├ driver/
│ └ chromedriver.exe
└ main.exe
(※実際には他にもたくさんフォルダ・ファイルができます)
コマンドラインオプションに指定せずにspecファイルに書くことでも同様のことができます。
a = Analysis(...
binaries=[ ( './driver/chromedriver.exe', './driver' ) ],
...
specファイルはPyInstallerを実行すると勝手に作られるので、作られたやつを修正して使うのがいいと思います。
加えたいファイルが複数ある場合なんかはspecファイルのほうが使い勝手がいいと思います。
specファイルでビルドする場合は以下のようにします。
pyinstaller main.spec
PyInstallerの設定としては以上の内容で大丈夫ですが、ソースもちょっと修正する必要があるかもしれません。
次の項で説明します。
--onefile
オプションを使う場合、--add-binary
で指定したバイナリファイルはexe内に取り込まれます。それらは、実行時に一時フォルダに展開されます。そのため、Pythonのソース内で相対パスを使用してたりするとうまく動かない場合があります。
例えば以下のように相対パスを使用している部分は書き換える必要があります。
driver = webdriver.Chrome('./driver/chromedriver.exe')
次のように書き換えます(必要なモジュールはimportしてください)。
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.dirname(__file__)
return os.path.join(base_path, relative_path)
driver = webdriver.Chrome(resource_path('./driver/chromedriver.exe'))
関数resource_path
を追加してそれを使用するようにします。
resource_path
は以下のロジックでパスを取得します。
sys._MEIPASS
(exeから実行時、一時フォルダのパスが入る)からの相対パスを取得する。__file__
)からの相対パスを取得する。これでPythonから実行しても、exeファイルで実行してもちゃんと動きます。
画像ファイルなどをexeに内包したい場合などでも同じです。 この記事ではchromedriverをexeに入れるということをしていますが、同様のやり方でchromium等のブラウザも内包させることができます。
Python で Selenium を使ったプログラムを PyInstaller で実行ファイル化する自分用まとめです。 …
pythonで作ったプログラムを実行ファイル(.exe)に変換するのには、PyInstallerが使えます。 他にも実行 …
Ajaxなんかで動的に変化するページの場合は、ページが変更完了するまで待ちたい場合があります。 そういうときは特定の条件 …
PyInstallerを使えば簡単にexeを作成できますが、1つのフォルダに複数のexeを作るにはどうすればよいのか分か …
selenium の読み込みスピードを速くするために、広告などの邪魔なjsをブロックしたいと思いました。 …
Python Selenium を実行すると ChromeDriver のコンソールウィンドウが表示されてしまいます。 …
Pythonを使ってExcelファイルの図形内にあるテキストを置換します。 また、図形の中のテキストを読み取ったり、図形 …