飞道的博客

使用pyinstaller将python项目打包发布为exe可执行文件

452人阅读  评论(0)

pyinstaller模块用于将python项目打包发布成exe文件,以方便地在没有安装python环境的机器上运行。该模块使用 pip install pyinstaller 安装即可。

一、常用参数及含义

参数 执行命令 含义

-D

pyinstaller -D demo.py

默认选项。除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用。

-c

pyinstaller -c demo.py

默认选项。使用控制台,只对windows有效。

-F

pyinstaller -F demo.py

只在dist文件夹中生成一个程序demo.exe文件,适用于没有多依赖.py文件的单个文件。

-w

pyinstaller -w demo.py

不使用控制台,只对windows有效。

-p

pyinstaller -p D:\project\demo.py

设置导入路径。

-i

pyinstaller -i D:\icons\demo.ico demo.py

给生成的demo.exe文件设置一个自定义的图标。

二、打包简单的.py文件

对一个简单.py文件,当没有依赖的其他路径下的.py文件、没有间接依赖的其他包、没有依赖的资源文件时,可使用命令pyinstaller –F xxx.py,直接打包成一个exe文件。

示例:一个简单的整数求和小程序

1) 命名calculator.py,写入内容


  
  1. if __name__ == '__main__':
  2. print( "求和小程序")
  3. a = input( "请输入第一个数:")
  4. b = input( "请输入第二个数:")
  5. print()
  6. c = int(a) + int(b)
  7. print( "两数之和为:", c)
  8. input()

2) 使用命令pyinstaller -c –F calculator.py直接打包。执行完毕后,程序目录下生成了build、dist两个文件夹和一个calculator.spec文件。生成的exe文件即存在于dist文件夹中

        ——dist文件夹,发布目录,存放打包后的exe文件;

        ——build文件夹,存放一些中间过程文件,可忽略;

        ——.spec文件,即配置文件,用于打包复杂的python项目。

3) 双击calculator.exe,启动运行

三、由spec配置文件打包复杂的项目

实际的项目往往是复杂的,或有许多依赖的其他路径下的.py文件,或有许多间接依赖的包,或有许多涉及的资源文件,因此,需要通过spec配置文件进行打包发布。

由spec配置文件打包发布完毕后,必定会在dist中生成一个文件夹,里面不只有生成的exe文件,还有许多其他的依赖文件。此模式下,通常使用命令 pyinstaller –D xxx.spec 进行发布。

基本步骤:

s1.生成spec文件:执行命令 pyi-makespec main.py ,执行后生成main.spec文件(main.py是项目启动的入口文件);

s2.完善spec文件中的内容

1) Analysis的第一个列表:填入需要打包的.py文件路径,以字符串形式作为列表元素填入。

注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;

       b.打包操作实质上就是将这些文件直接复制到生成的包中。

2) Analysis的datas列表:填入需要打包的非.py类型资源文件,以元组形式作为列表元素填入,路径写至最后一个目录层级。

注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;

       b.打包操作实质上就是将这些文件复制到生成的包中。

3) Analysis的hiddenimports列表:填入需要直接或间接依赖的一系列包名。

猜测:在pyinstaller打包的过程中,实际上可以包含程序直接依赖的包,但无法包含间接依赖的包,因此需要在hiddenimports列表中配置导入。

写法示例


  
  1. a = Analysis([ 'test.py',
  2. 'D:\\deploy\\a.py',
  3. 'D:\\deploy\\b.py',
  4. 'D:\\deploy\\c.py'],
  5. pathex=[ 'D:\\PycharmProjects\\Test'],
  6. binaries=[],
  7. datas=[( 'D:\\deploy\\resourceA', 'resourceA'),
  8. ( 'D:\\deploy\\resourceB', 'resourceB')],
  9. hiddenimports=[ 'pandas', 'cython', 'sklearn', 'sklearn.metrics',
  10. 'sklearn.metrics.get_scorer', 'sklearn.metrics.cluster',
  11. 'sklearn.ensemble', 'sklearn.neighbors.typedefs', 'sklearn.neighbors.quad_tree',
  12. 'sklearn.tree._utils', 'scipy._lib.messagestream', 'email.mime.message',
  13. 'email.mime.image', 'email.mime.multipart', 'email.mime.audio', 'email.mime.text',
  14. 'sklearn.neighbors._typedefs', 'sklearn.utils._weight_vector', 'sklearn.neighbors._quad_tree',
  15. 'win32timezone'],
  16. hookspath=[],
  17. runtime_hooks=[],
  18. excludes=[],
  19. win_no_prefer_redirects= False,
  20. win_private_assemblies= False,
  21. cipher=block_cipher,
  22. noarchive= False)

s3.打包发布

执行命令 pyinstaller –D main.py,dist目录下的main文件夹即发布生成的项目文件。

四、问题处理

1.当双击exe文件无法看到错误信息时,可尝试通过cmd进入对应目录后命令运行:xxx.exe

2.对于hiddenimports里面不知道具体依赖的包有哪些,一个笨办法是,在cmd下执行xxx.exe,根据提示的错误信息,逐一加上缺失的包。

3.杀毒软件可能会干预,最好打包发布前退出杀毒软件。

 

参考

  1. https://www.cnblogs.com/milesma/p/12171893.html
  2. https://blog.csdn.net/weixin_43502949/article/details/101057825?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
  3. https://www.tqwba.com/x_d/jishu/162792.html

 


转载:https://blog.csdn.net/Albert201605/article/details/116659148
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场