内藤 裕二/ 2月 5, 2019/ PyInstaller, Python, 技術

TL;DR

ubuntu側で開発したPythonスクリプトをWindowsの実行体に変換する必要があった
実際の作業で何点かハマったので、まとめておく
ちょっと前の作業をまとめているので、バージョン情報等あいまい

発端

ubuntuで開発したPythonスクリプトをWindows上で実行する必要があった。
将来的に配布を簡単にしたい、という要望もあり、使用するPCに逐一Python環境をインストールするのは避けたかったので、PyInstallerにて実行体に変換した。
いくつかハマったことがあったので、後学のためにまとめておく。

ブログに起こすにあたってググってみたら、大半は下記の記事にあった・・・
PyInstallerを使ってみた

ハマったこと

__file__の指すパスがおかしい

PyInstallerで実行体化すると、__file__シンボルが、実行体変換前のパスに置換されてしまう模様。
参照URLでも言及されていたが、sys.argv[0]に置き換えて対処。

PyInstallerで指定したモジュールよりも上の階層のソースコードが実行体に同梱されない

ソースコードは下記のようなフォルダ構成だった。

├ Func1
│  ├ func1_entry.py
│  └ func1_body.py
└ Main
   └ main.py

main.pyから、上の階層のfunc1_entry.pyをimportして使用している。
PyInstallerの対象モジュールとして、main.pyを指定すると、できた実行体を実行した際に、’func1_entry.py が見つからない’旨の実行時エラーが発生する。

これは結局解消できなくて、フォルダ構成を下記のように変更した。

└ Main
   └ main.py
      └ Func1
         ├ func1_entry.py
         └ func1_body.py

pandasでcsv読み込む際の行デリミタのデフォルトが異なる

PyInstallerを実行するPython環境はAnacondaで作成したのだが、pandasのread_csv関数でcsvファイルを読み込む際に、’Cr’, ‘Lf’どちらも行デリミタとして認識されてしまった。
Excel等で作成したcsvファイルは’Cr + Lf’が行デリミタなので、倍の行数があるように見えてしまった。
read_csv関数に明示的にデリミタ設定することで対応。

参照URL