背景
numpy とか torch とか入ったアプリを単体で配布したい.
pyinstaller で .exe とパッケージ作れるが, バグとか修正とかあって一部差し替えしたいが作り直しになってつらい.
(.exe だとアンチウイルスチェックかかったりして毎度配布がめんどい)
py だけ差し替えしたい
とりあえずの方法
exec でがんばります.
# mymodule.py
def bora():
print("hello")
# main.py
def main():
import mymodule
exec(open("custommod.py").read())
main()
# custommod.py
def myfunc():
import mymodule
mymodule.bora()
myfunc()
main.py とかに自前アプリのカスタム module がある場合は import しておきましょう.
そうしないと pyinstaller がパッケージングしてくれず, custommod 内での自作 module インポートに失敗します.
これで main.py を .exe
にしておき, あとで custommod.py だけ差し替えてもらうでいけます!
(自作 module とかに変更なければ)
全体を差し替え可能にする.
使う modules が変わらない場合,
# myapp.py
...
def main():
...
# bootstrap.py
import myapp
exec(open("myapp.py").read())
myapp.main()
として, bootstrap.py
を .exe
化するといけるのがわかりました!
ただ, 一部うまく import が含まれないときがあります.
私の場合は tkinter, PIL 使っていて PIL._tkinter_finder
が含まれませんでした.
spec ファイルなり -hiddenimports
オプションで適宜指定してあげましょう!
hiddenimports=['PIL._tkinter_finder'],
TODO
- pyinstaller に module 関係だけパッケージしてメインは python.exe で動かす方法あったりするかしら
- conda とかで環境一式を特定のフォルダにつくってそれで完結させるのとかできないかしら