pyinstaller打包多个py文件,用pyinstall工具把Python源文件打包
第一次把我的python爬虫项目打包成exe,留个备注。本文详细介绍了python非单。py文件由Pyinstaller打包发布为exe,有一定的参考价值。有兴趣的可以了解一下。
00-1010一:背景及项目结构介绍二:实现步骤一:总体思路二:安装pyinstaller3:具体步骤(以我的项目为例)三:麻烦的病和需要注意的坑一:模块问题二:打包后总是提示Failedtoexecutescrptxxx问题三:CMD运行打包的exe。运行一段时间后,卡主就不动了,然后回车继续。
目录
我第一次把我的python爬虫项目打包成exe。我在网上搜了很多教程,大部分都是打包了一个py文件的小demo。来,请先给我一个笑脸。除了hello-world可以去,真的没什么用。
再来看看我的项目层次结构,pycharm为项目建立的虚拟python解析器,(我不用本地python解释器,因为我怕项目太多环境会越来越乱),它分为很多pythonpackage包{core包(项目入口的py模块),docs包(txt文件等非源代码资源文件),logs包,test包,utils包)。每个包模块都是独立开发的,不同包下的模块之间会有相互的导入依赖关系。程序的入口是核心包下的spider_main.py。
一:背景以及项目结构介绍
二:实施步骤
整个步骤中有两个命令。
(1)pyi-makespec -w xxx.py
第一条命令使用pyi-makespec -w xxx.py命令生成项目入口模块的spec文件,然后进行自定义编辑,在简洁的spec文件中指定我们需要的资源,比如买房装修。我们现在有一些家具,比如沙发,电视(源码),锅碗瓢盆(非代码资源文件,比如txt文档,png图片等。).项目中需要)等。进门码模块是我们看中的房子的钥匙,房产中介pyinstaller给我们送来了一套样板房(进门模块生成的spec文件)。样板房已经设置了客厅、厨房、卧室等格局(规格文件中配置单元不同)。我们的客厅、厨房、卧室(不同配置单元)放什么,是我们根据房子装修方案(项目实施需求)选择的。
pyi-makespec -w xxx.py
(2)pyinstaller -D xxx.spec
第二条命令通过pyinstaller -D xxx.spec命令使用定义好的spec文件(根据装修方案)生成完整工程(装修我们的房子)的exe程序。
pyinstaller -D xxx.spec
1:总体思路
因为我使用的是虚拟python解释器,要安装pyinstaller,请单击项目虚拟Python环境空间pycharm中的底部终端,并键入命令pip install pyinstaller来安装它。
安装pyinstaller
2:安装pyinstaller
(1)生成一个规格文件并填写内容。
执行命令:
pyi-make spec-w c : Users admin PycharmProjects spider Xie cheng car 3 venv Include Xie cheng car _ spider core spider _ main . py
(直接使用入口模块的绝对路径)
ush:py;">pyi-makespec -w C:UsersadminPycharmProjectsspiderxiechengcar3venvIncludexiechengcar_spiderspider_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:UsersadminPycharmProjectsspiderxiechengcar3spider_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:UsersadminPycharmProjectsspiderxiechengcar3这个位置的,不要随便进入C:UsersadminPycharmProjectsspiderxiechengcar3venvIncludexiechengcar_spider这个目录下去执行命令,必须要在顶层目录执行命令,不要问那个傻逼这么闲还得cd到处看看,没错就是我,在打包的时候,pyinstaller才能找到目录下的一些lib包和其他包下的具体依赖,如果依赖的东西模块不全,总会报nomodle等错误,不管你怎么填充spec文件的datas列表都无济于事,坑了我半天,头发都愁掉光了。
2:打包后,一直提示Failedtoexecutescrptxxx问题
打包成功,但是没有报任何错误,但是运行exe文件时,总是会提示excutefail的错误,然后去看build的warn.txt文档会提示各种miss的model信息,不要去往这钻牛角尖,这时候,你一是先检查打包的路径是不是项目的顶层目录可以加载lib里的其他依赖模块,二是编辑spec文件,将exe单元下的console属性改成True(默认是false)记得保存,然后重新执行以下第二个命令,重新打包exe包之后,在cmd下运行exe执行文件,这时候会出现报错误原因(如果不改spec这个字段内容,无论是双击运行,还是cmd中运行,都只会弹出这个failedtoexcute的无头脑error,别问头为什么知道,被坑出来的),根据提示来解决具体是缺少依赖模块原因还是代码中读不到非代码资源(txt,png..),如果读不到非代码资源,就根据提示的notfound的路径,手动建立相关目录,放上需要用到的文档资源。
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的时候这个文件是写在distspider_mainIncludexiechengcar_spiderdocs
这里,但是在windos powershell 里面,当前的父目录默认是在c:// 这里,他就要找c://docsipool.log文件,具体为什么会在程序结束最后抛出了这样的路径错误,我还是百思不得其解,知道其原因的网友希望能帮忙解答一下,对于这个问题经过测试三种方法,一是在它需要的这个目录放一个这个的文件,二是:直接双击exe来执行就好,程序运行完了,直接就关掉了,没发现报这个错,三:直接忽略掉,但是我不确定会不会影响项目结果。
到此这篇关于python非单一.py文件用Pyinstaller打包发布成exe的文章就介绍到这了,更多相关Pyinstaller打包发布成exe内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。