昨年末から社内業務でPythonを使い始めました。まだ初心者ですが、学んだことやはまってしまったことなど共有していきたいと思います!
Pythonで作ったプログラムを、自分のPC以外の他のマシンで動かしたいということはあると思います。
便利ツール系のプログラムなど、作ったものを誰かにあげたいということもありますよね。
ただし、Pythonプログラムを動かすには環境構築をしなければならず、それが結構大変です。
Pythonを普段使わない人に、便利なツールあげるから、Pythonをインストールして、パスを通して、仮想環境を作って、必要なライブラリを入れておいてね!
というのはなかなか酷だと思います(えっ、そんなめんどうならいらないよ・・・、と言われてしまいそう)。
そこでPython環境がないPCでも実行ができるように、PyInstallerを使ったexe化の方法をご紹介したいと思います。
サンプルソース
こちらが今回exe化するneko.pyのサンプルソースです。
outputフォルダを生成し、フォルダ中にNECO.txtを作成し保存します。
/* neko.py */
import os
import sys
import shutil
#outputフォルダを再生成しフォルダパス取得
def getOutputPath():
os.chdir(os.path.dirname(sys.argv[0]))
if(os.path.isdir('output/')):
shutil.rmtree(os.getcwd()+'\output')
os.mkdir(os.getcwd()+'\output')
os.chdir('output')
return os.getcwd()
# main function
if __name__ == "__main__":
print ("-------------- start --------------")
outfilepath = getOutputPath()
outfilename = outfilepath + '/NECO.txt'
if (os.path.isfile(outfilename)):
os.remove(outfilename)
f = open(outfilename, 'x', encoding='UTF-8')
f.write('2月22日は「ニャン・ニャン・ニャン」で猫の日です\n')
f.close()
print ("-------------- end --------------")
実行結果は次のようになります。outputフォルダ中にNECO.txtが作成されています。
Pyinstallerのインストール
Pythonをexeにするライブラリは複数あるのですが、今回はPyinstallerを使います。
PyInstallerを選んだ理由は最も有名であることと、初心者でも簡単に使えそうだったからです。
Pyinstallerを仮想環境にインストールします
conda install pyinstaller
※condaの場合です
Pyinstallerを使ってexeファイルを作成する
次のコマンドでPythonをexe化します
pyinstaller xxx.py --onefile
successfullyと出れば生成完了です。
distフォルダ内にexeファイルができました!
作成したexeの動作確認をする
では出来上がったexeファイル(neko.exe)を他のマシンにおいて実行してみます。
実行完了後、outputフォルダにneko.exeができています!
他のマシンに配布成功しましたね!!
exeにアイコンをつける
作ったexeファイルに、オリジナルのアイコンをつけることができます!
neko.exeにもアイコンをつけてみたいと思います。
アイコンの用意
画像素材を用意します。
ねこちゃんです(白猫なのでここでは分かりやすいように背景を黒にしています)
画像は「ドット絵ダウンロードサイト DOTOWN」の素材を使わせていただきました。
かわいいドット絵フリー素材がいっぱいです。覗いてみて下さいね!
PNGファイルを.ico形式に変換してアイコンをつくります。
今回は「アイコン コンバータ」を利用して画像をアイコンに変換しました。
ダウンロードしたアイコンのファイル名を「neko_icon.ico」にします。
pyinstallerでexe化するときにアイコンを指定する
次のコマンドでアイコンを指定してPythonをexe化します。–iconオプションでアイコンファイルを指定します。
pyinstaller --onefile --icon=neko_icon.ico neko.py
生成完了しました!
neko.exeにねこちゃんアイコンがつきました!可愛い!!
はまったこと(ファイルパス問題)
ここで私がexe化の際にはまったことを書いておきます。
サンプルソースでファイルパスを取得している次の箇所ですが
os.chdir(os.path.dirname(sys.argv[0]))
ソースコードのあるディレクトリにoutputフォルダを生成したいため、ソースコード自身のパスを取得しようとしています。
この処理、最初は__file__でパスを取得していたのですが、exe化すると期待通り動きませんでした。
exe化した場合はexeのあるパスが取れてほしかったのですが、そうはなりませんでした。
(exeファイルのあるディレクトリにoutputフォルダとNECO.txtを生成するようにしたかったが作られなかった)
それを回避するため、sys.argvでコマンドライン引数のリストを使うことにしました。
argv[0]はスクリプト名で、exe自身のパスを取得することができました。
exe化の際のファイルパス問題については、多くの人が記事を書いていらっしゃるので、気になる方はチェックしてみて下さい。
自分もすごく参考にさせていただきました!
ファイル/フォルダを参照するようなプログラムをexe化するときは要注意だなと思いました。