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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python pyinstaller打包exe报错的解决方法

    今天用python 使用pyinstaller打包exe出现错误 环境pyqt5 + python3.6 32位 在导入pyqt5包之前加上如下代码 import sys import os if hasattr(sys, 'frozen'): os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] from PyQt5.QtWidgets import QApplication, QMainWindow from py

  • 用python打包exe应用程序及PyInstaller安装方式

    目录 1.PyInstaller简介 2.PyInstaller安装 3. 准备需要的文件 4.使用Pyinstaller 5.参数的含义 6. 附圣诞树源文件 7. 源文件下载 1.PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,从而允许最终用户在无需安装 Python 的情况下执行应用程序. PyInstaller 制

  • PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

    环境: win7+python3.5(anaconda3) 理论上,win7及以上的系统和python任意版本均可. 一.基础脚本 首先我们构建一个简单的脚本,比如输出一串数字.文本之类,这里我们输出一串文字的同时计算一下3次方好了. # -*- coding: utf-8 -*- """ Created on Wed Aug 29 09:18:13 2018 @author: Li Zeng hai """ def test(num): pri

  • python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

    本文介绍一个exe打包工具pyinstaller,使用非常简单.方便,而且还跨平台. 软硬件环境 Windows 10 64bit PyQt5 Anaconda with python 3.6.5 pyinstaller apscheduler sqlalchemy pyinstaller安装 命令行中执行 pip install pyinstaller pyinstaller打包exe 示例还是以之前的为例,解压进入工程目录,命令行执行打包命令 pyinstaller -F --distpat

  • python3.9实现pyinstaller打包python文件成exe

    简述 1.python python作为一门解释型脚本语言,它有三种发布方式: 文件 : 源码文件,运行需要使用者安装Python环境并且安装依赖的各种库 pyc文件:pyc文件是Python解释器可以识别的二进制码,可跨平台的,需要使用者安装相应版本的Python和依赖库. 可执行文件:不需要安装python环境和依赖库,可针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,-) 2.pyInstaller PyInstaller工具可以把python解析器和脚本打包成一

  • pyinstaller打包exe程序的步骤和添加依赖文件的实现

    目录 pyinstaller打包exe程序和添加依赖文件 1.安装pyinstaller库 2.pyinstaller的打包机制 3.打包命令 4.添加导包外的一些依赖文件 5..spec方式打包 6.pyinstaller常用参数 pyinstall打包时的依赖问题 pyinstaller打包exe程序和添加依赖文件 或许我们并不是专业的程序猿,但是却可以通过python来提高我们的工作效率,减少加班时间,让代码替我们完成一些重复的工作,节省下来的时间去泡个妹子,牵牵小手不香吗 话不多说,马上

  • pyinstaller打包程序exe踩过的坑

    基础环境 python 2.7.17 pyinstaller 3.5 安装pyinstaller pip install pyinstaller 坑,大坑,深坑 背景:用pygame写了个贪吃蛇游戏,要打包成exe 用到了字体文件 C:\Windows\Fonts\simsun.ttc (宋体) 打包过程中没有报错 打包过程中的警告可以忽略,这个警告: WARNING: Hidden import "pygame._view" not found! 运行exe的时候报NotImplem

  • python非单一.py文件用Pyinstaller打包发布成exe

    目录 一:背景以及项目结构介绍 二:实施步骤 1:总体思路 2:安装pyinstaller 3:具体步骤(以我项目为例子) 三:疑难杂症和需要注意的坑 1:打包找不到模块问题 2:打包后,一直提示Failed to execute scrpt xxx问题 3:cmd下运行打包好的exe,运行一段时间卡主不动,按一下回车才继续 4:其他注意事项 一:背景以及项目结构介绍 第一次将自己做的python爬虫项目打包成exe,搜了很多网上教程,大部分都是打包一个py文件的小demo,这里先给个笑脸吧,除

  • 如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件

    目录 准备工作 根据exe生成pyc文件 根据pyc文件反编译为py文件 参考 总结 准备工作 没有加壳的python编译并打包的exe文件 python反打包代码(不知道这样叫是否合理):python-exe-unpacker 16进制编辑查看器 :Hex Editor Neo 反编译库 :uncompyle6 根据exe生成pyc文件 下载并解压缩 python-exe-unpacker 代码,myfile.exe为需要反编译的exe文件 使用python运行 python-exe-unpa

  • Python中__init__.py文件的作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能.我们在导入一个包时,实际上是导入了它的__init__.py文件.这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入. # package # __init__.py import re import urllib import sys impo

  • 解决pyinstaller打包发布后的exe文件打开控制台闪退的问题

    解决步骤: 1.先打开一个cmd 2.cd到你的exe文件目录 3.输入    .\***.exe 以上这篇解决pyinstaller打包发布后的exe文件打开控制台闪退的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python 在某.py文件中调用其他.py内的函数的方法

    假设名为A.py的文件需要调用B.py文件内的C(x,y)函数 假如在同一目录下,则只需 import B if __name__ == "__main__": B.C(x,y) 若只需调用单个函数,也可以 from B import C if __name__ == "__main__": C(x,y) 若A.py和B.py位于不同的目录下,可以用以下方法 (假设B.py位于D盘的根目录下) 1.引用所在路径 import sys sys.path.append(

  • python中关于py文件之间相互import的问题及解决方法

    目录 问题背景 实例演示 问题背景 调试脚本时,遇到一个问题:ImportError: cannot import name 'A' from 'study_case.a' (/Users/rchera/PycharmProjects/test/study_case/a.py) 具体情况是这样婶儿的: 前些日子写了一个py文件,它的功能主要是创建数据(暂且称为create_data.py,每条数据会生成一个唯一的id): 同时写了另一个py文件,它的功能主要是操作数据,例如对数据进行编辑.删除等

  • Python中__init__.py文件的作用

    目录 1 init文件夹图标 2 init.py导入包方式 2.1 单个导入 2.2 批量引入(定义__all__用来模糊导入) 3 实例 4 其他常见问题 4.1 使用__init__.py文件的优点 4.2 没有__init__.py文件的目录,使用import xx.xx会报错吗? 4.3 根据导入模块和主程序不同import方式 1 init文件夹图标 在PyCharm中,带有__init__.py这个文件的目录被认为是Python的包目录,与普通目录的图标有不一样的显示.如下图所示,d

  • python引入其他py文件或模块

    以 a.py 想引入 b.py 为例: 1.b.py 与 a.py 在同一目录下: import b 2.b.py 在某文件夹内,目录结构类似如下: filename1----filename2--------b.pya.py 解决方法:添加 init.py 文件 目录结构变为: filename1----__init__.py----filename2--------__init__.py--------b.pya.py 然后就可以在 a.py 通过import引入了: import file

  • 深入理解Python中__init__.py文件

    目录 1. 简介 1.1 模块(Module)和包(Package)的概念 1.2 __init__.py文件简介 2. __init__.py内容写法 2.1 __init__.py文件内容 2.2 __init__.py内容解释 1. 简介 1.1 模块(Module)和包(Package)的概念 模块是程序,任何Python程序都可以作为模块导入.写在脚本.py文件中的函数,比如xx.py,可以在另一个模块或者脚本中通过import xx进行导入.如果要导入xx.py中的函数yy,就写成f

  • Pyinstaller 打包发布经验总结

    使用Pyinstaller打包Python项目包含了大量的坑,这篇文章总结实践得到的Pyinstaller打包经验.本文的例子为Python3.6代码,Pyinstaller3.4,在windows下打包为64位和32位版本. Pyinstaller基本使用方法 Pyinstaller可以通过简单的命令进行python代码的打包工作,其基本的命令为: pyinstaller -option xxx.py options的详情可参考官方帮助文档https://pyinstaller.readthe

随机推荐