pyinstaller程序打包

使用pyinstaller可以将写好的python程序打包成可执行文件。

两种打包方式:

  1. 打包成只有一个exe文件的形式,但这种程序在运行时其实比较慢,因为会需要额外的时间将exe文件里的依赖包解压到一个临时文件夹。
  2. 打包成一个目录,当前的版本会将所有的依赖包,包括程序自已写的代码(包括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据说会只将程序里引用到的包进行打包,而不会将整个程序使用的python解释器环境(一般是虚拟环境)里所有的模块都打包。 可以将pyinstaller安装在一个通用的环境中,而被打包程序在其它的虚拟环境中,这是可以的,但需要使用参数来指定虚拟环境依赖项的位置。 个人感觉学习命令参数比较复杂,干脆在要打包的程序环境中安装一下pyinstaller算了,并且打包时也不会把pyinstaller包本身打到程序包里。

posted @ 2024-11-08 19:20  RolandHe  阅读(70)  评论(0编辑  收藏  举报