使用pyinstaller可以将写好的python程序打包成可执行文件。
两种打包方式:
- 打包成只有一个exe文件的形式,但这种程序在运行时其实比较慢,因为会需要额外的时间将exe文件里的依赖包解压到一个临时文件夹。
- 打包成一个目录,当前的版本会将所有的依赖包,包括程序自已写的代码(包括main.py,即程序入口模块)都会在 _internal 文件夹内。
打包后的程序要想分别在windows和mac系统上运行,那么打包时也必须分别在windows系统和mac系统上打包。
多进程并行处理
如果打包的程序内部有启用多进程,那么需要在程序主入口增加一行代码,否则运行会报错。并且,这行代码目前只需要在windows系统上加,原因是windows系统的python并行机制的问题,不加的话会无限开启新进程,系统会因资源耗尽而卡死。无论是直接使用了multiprocessing模块,还是进程池,这行代码都有效。
if __name__ == "__main__":
multiprocessing.freeze_support() # 使用pyinstaller打包后,如果不加这行代码,并行处理会出问题
配置文件的位置
通常我们会将配置文件放置在与exe文件同级的目录里。而在程序里,我们通常会使用最外层模块,比如main,或与之同级的其他模块的__file__
来确定根目录的位置。这在以前的pyinstaller版本是可行的,但是目前的版本打包后,__file__
获取到的目录将是 _internal 文件夹。而我们通常习惯上不会将配置文件放在这个文件夹里,这里边默认就当成是程序的依赖包,用户不会进去找文件。
pyinstaller官网推荐我们使用下面的代码来判断程序主目录:
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
# print('在 PyInstaller 打包中运行')
BASE_DIR = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(BASE_DIR)
else:
# print('在普通的 Python 进程中运行')
BASE_DIR = os.path.dirname(__file__)
标签:__,pyinstaller,程序,打包,file,DIR
From: https://www.cnblogs.com/rolandhe/p/18535742