Python 打包心得-程序篇
获取 exe 的执行目录
由于打包成一个文件的 exe 会解压到临时目录,所以使用 os.listdir
读取的是那个临时目录。因此使用 os.makedirs('./test')
或者 open('./log.txt, 'w')
等很常见操作都会出问题。
要用 os.chdir(os.path.dirname(os.path.abspath(sys.executable)))
才能改变成 exe 所在的实际目录。但如果不是 exe 而是日常使用 py 文件则又不对,所以最终改成:
# 正常运行 .py 文件时
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
if getattr(sys, 'frozen', False):
# 被 PyInstaller 等工具打包后的执行路径
BASE_DIR = os.path.dirname(sys.executable)
使用 multiprocessing 一定要加一条语句!!
在 Windows 中如果使用了 multiprocessing 库,一定要用 __name__=="__main__"
,并且一定要一开始就加一条下面的语句。
因为 Windows 下没有 fork,只能用 spawn 启动子进程,它会重新 import 入口脚本。子进程在导入模块时又重新执行了主进程的代码,造成无限递归。
参考:
1. https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing
2. https://stackoverflow.com/questions/32672596/pyinstaller-loads-script-multiple-times
if __name__ == "__main__":
multiprocessing.freeze_support()
main()