python非单一.py文件用Pyinstaller打包发布成exe
目录
- 一:背景以及项目结构介绍
- 二:实施步骤
- 1:总体思路
- 2:安装pyinstaller
- 3:具体步骤(以我项目为例子)
- 三:疑难杂症和需要注意的坑
- 1:打包找不到模块问题
- 2:打包后,一直提示Failed to execute scrpt xxx问题
- 3:cmd下运行打包好的exe,运行一段时间卡主不动,按一下回车才继续
- 4:其他注意事项
一:背景以及项目结构介绍
第一次将自己做的python爬虫项目打包成exe,搜了很多网上教程,大部分都是打包一个py文件的小demo,这里先给个笑脸吧,除了hello-world能去,其他真的屁用没有。
先看一下我的项目层级结构,pycharm建立的项目用的虚拟python解析器,(不用本地的python解释器是因为怕项目多了,环境会越来越乱),分了很多python package包{core包(项目入口py模块),docs包(有txt文件等非源代码资源文件),logs包,test包,utils包),每个包模块单独开发,并且会有不同包下模块之间的互相import的依赖关系,程序的入口时core包下的spider_main.py。
二:实施步骤
1:总体思路
整个步骤一共俩命令
(1)pyi-makespec -w xxx.py
第一个命令用 pyi-makespec -w xxx.py 命令生成项目入口模块的spec文件,然后对其自定义编辑,在简约的spec文件里指定我们需要的资源,就比如要买房子并且装修,我们现在有一些家具,比如沙发呀电视呀(源代码),锅碗瓢盆(非代码的资源文件,比如txt文档,png图片等,项目中需要用到的)等,入口代码模块就是我们看中的这套房子的钥匙,物业中介呢(pyinstaller)交付给我们一个样板房(由入口模块生成的spec文件)。样板房现在设好了客厅,厨房,卧室等格局(spec文件中不同的配置单元),具体在我们的客厅厨房卧室(不同的配置单元)放什么就是我们根据房子装修计划(项目执行需要)去选择。
pyi-makespec -w xxx.py
(2)pyinstaller -D xxx.spec
第二个命令通过 pyinstaller -D xxx.spec 命令使用定义好的spec文件(根据装修计划),生成完整项目的exe程序(装修我们的房子)。
pyinstaller -D xxx.spec
2:安装pyinstaller
因为我用的是虚拟python解释器,所以安装pyinstaller要在项目虚拟Python环境空间,pycharm上点击最下面的Terminal,敲入命令 pip install pyinstaller 进行安装。
pip install pyinstaller
3:具体步骤(以我项目为例子)
(1)生成spec文件,并填充内容
执行命令:
pyi-makespec -w C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider\core\spider_main.py
(直接用入口模块的绝对路径)
pyi-makespec -w C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider\spider_main.py
先看一下刚生成的spec文件都需要我们补充什么内容吧,具体功能模块我搬过来了,放在图下面介绍。
在看一下我补充好的spec文件内容,联系我的项目层级结构作参考。
各个单元的作用。
a) py文件打包配置
针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。
b) 资源文件打包配置
资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas。
c)Hidden import配置
pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块。
(2):开始装修房子(打包exe)。
通过第二个命令 pyinstaller -D xxx.spec(直接给个生成的spec文件的绝对路径,spec文件生成在了Terminal代开的根目录下) 打包成exe安装包。
pyinstaller -D C:\Users\admin\PycharmProjects\spider\xiechengcar3\spider_main.spec
(3):验证exe
(a)查看生成的内容,
进入执行命令的根目录,发现多了两个文件夹:build 和 dist
build为临时文件目录,里面记录了一些打包的错误信息warn-xx.txt,如果是在找不到问题可以看两眼.;dist中存放打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下。
根目录内容:
build目录内容:
dist目录内容:
(b):运行exe文件(1:直接双击exe文件 ;2:在cmd下,cd到当前目录,输入spider_main.exe 运行)
三:疑难杂症和需要注意的坑
1:打包找不到模块问题
进入了Terminal就要闲着没事 cd 进后面的项目目录了,比如打开terminal之后默认位置是在 C:\Users\admin\PycharmProjects\spider\xiechengcar3 这个位置的,不要随便进入 C:\Users\admin\PycharmProjects\spider\xiechengcar3\venv\Include\xiechengcar_spider 这个目录下去执行命令,必须要在顶层目录执行命令,不要问那个傻逼这么闲还得cd到处看看,没错就是我,在打包的时候,pyinstaller才能找到目录下的一些lib包和其他包下的具体依赖,如果依赖的东西模块不全,总会报no modle等错误,不管你怎么填充spec文件的datas列表都无济于事,坑了我半天,头发都愁掉光了。
2:打包后,一直提示Failed to execute scrpt xxx问题
打包成功,但是没有报任何错误,但是运行exe文件时,总是会提示excute fail的错误,然后去看build的warn.txt文档会提示各种miss的model信息,不要去往这钻牛角尖,这时候,你一是先检查打包的路径是不是项目的顶层目录可以加载lib里的其他依赖模块,二是编辑spec文件,将exe单元下的console属性改成True(默认是false)记得保存,然后重新执行以下第二个命令,重新打包exe包之后,在cmd下运行exe执行文件,这时候会出现报错误原因(如果不改spec这个字段内容,无论是双击运行,还是cmd中运行,都只会弹出这个failed to excute的无头脑error,别问头为什么知道,被坑出来的),根据提示来解决具体是缺少依赖模块原因还是代码中读不到非代码资源(txt,png..),如果读不到非代码资源,就根据提示的not found 的路径,手动建立相关目录,放上需要用到的文档资源。
3:cmd下运行打包好的exe,运行一段时间卡主不动,按一下回车才继续
原因:cmd跑exe的时候,在CMD快速编辑模式下,无意点到文字会选中文字,自动进入标记模式,并暂停程序,就得按任意键才能往下跑。
解决方法:
(1):非查错时避免cmd,采用双击exe文件来执行
(2):将选中文本进入cmd的文本编辑模式取消
CMD 在运行Python 程序时,偶尔会暂停,也不报错,按enter 可以继续。
根本原因在于,在快速编辑模式下,无意点到文字会选中文字,自动进入标记模式,并暂停程序。
解决方法:
1. CMD 标题栏右键
2. 取消快速编辑(取消后 无法复制CMD中的文字)
4:其他注意事项
(1):程序进行打包exe的时候,最好把模块中的测试main函数注释掉!
pyinstaller不会和python一样,即使你用 if __name__ == '__main__': 表示出来了,pyinstall在导入模块的时候,也会把你的main下的内容全部进行了编译,所以人生建议,一定要注释掉,如果再有路径引用,那真是各种 file not found 问题层出不巧,让你摸不到头脑!不管你其他模块调没调用!
(2)用windos powershell 运行你的exe程序的时候,程序结束,会报filenotfound问题,但是直接双击打开exe或者pycharm运行就没问题
让你很疑惑:为什么最后要去c盘找这个破东西息,而且哪怕里面没有写入任何数据,但是他就是要这个文件,例如我这个问题:因为我的log文件的路径是用的这个函数
os.path.dirname(os.path.dirname(__file__)) + '/docs/ipool.log'
在pycharm里是获取了当前的父目录然后拼接成/docs 将log写在了父目录下的/docs/的ipool.log中,打包成exe的时候这个文件是写在dist\spider_main\Include\xiechengcar_spider\docs
这里,但是在windos powershell 里面,当前的父目录默认是在c:// 这里,他就要找c://docsipool.log文件,具体为什么会在程序结束最后抛出了这样的路径错误,我还是百思不得其解,知道其原因的网友希望能帮忙解答一下,对于这个问题经过测试三种方法,一是在它需要的这个目录放一个这个的文件,二是:直接双击exe来执行就好,程序运行完了,直接就关掉了,没发现报这个错,三:直接忽略掉,但是我不确定会不会影响项目结果。
到此这篇关于python非单一.py文件用Pyinstaller打包发布成exe的文章就介绍到这了,更多相关Pyinstaller打包发布成exe内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!