限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410
关注+星标自定义目录怎么设置,每天学习Python新技能
因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享
来源于网络,侵删一、将Python模块用pyinstaller打包成exe程序
pip install pyinstaller
python setup.py build_ext --inplace
setup.py是我们要调用的Python模块安装入口,它主要包含Python模块的依赖项和要打包的文件清单。
Pyinstaller基本使用方法
Pyinstaller可以通过简单的命令进行python代码的打包工作,其基本的命令为:
pyinstaller -option xxx.py
options的详情可参考官方帮助文档
这边只介绍用到的option:-d生成一个文件目录包含可执行文件和相关动态链接库和资源文件等;
-f仅生成一个可执行文件
-D, –onedir Create a one-folder bundle containing an executable (default)
-F, –onefile Create a one-file bundled executable.
对于打包结果较大的项目,选用-d生成目录相比单可执行文件的打包方式,执行速度更快,但包含更加多的文件。本文的例子选中-d方式打包。
二、Python项目的打包方法1.spec文件生成
为了进行自定义配置的打包,首先需要编写打包的配置文件.spec文件。当使用pyinstaller -d xxx.py时候会生成默认的xxx.spec文件进行默认的打包配置。通过配置spec脚本,并执行pyinstaller -d xxx.spec完成自定义的打包。
通过生成spec文件的命令自定义目录怎么设置,针对代码的主程序文件生成打包对应的spec文件
pyi-makespec -w xxx.py
打开生成的spec文件,修改其默认脚本,完成自定义打包需要的配置。spec文件是一个python脚本,其默认的结构如下例所示
# -*- mode: python -*-
block_cipher = None
a = Analysis(['fastplot.py'],
pathex=['D:\install_test\DAGUI-0.1\bin'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='fastplot',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='fastplot')
spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT.
2.spec文件配置
a) py文件打包配置
针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。如上的spec脚本,将所有项目中的py文件路径以列表形式写入Analysis,这里为了说明混合使用了绝对路径和相对路径。
b) 资源文件打包配置
资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas,datas接收元组:datas=[(SETUP_DIR+‘libicon’,‘libicon’),(SETUP_DIR+‘data’,‘data’)]。元组的组成为(原项目中资源文件路径,打包后路径)。
c)Hidden import配置
pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块,如例子中所示。
d)递归深度设置
在打包导入某些模块时,常会出现”RecursionError: maximum recursion depth exceeded”的错误,这可能是打包时出现了大量的递归超出了python预设的递归深度。因此需要在spec文件上添加递归深度的设置,设置一个足够大的值来保证打包的进行,即
import sys
sys.setrecursionlimit(5000)
3.使用pyinstaller命令执行 spec配置打包
pyinstaller -D xxx.spec
打包生成两个文件目录build和dist,build为临时文件目录完成打包后可以删除;dist中存放打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下。
注意:要打包的python模块的依赖项比如numpy等最好在pyinstaller安装之前,可避免生成错误。
三、c#调用pyinstaller打包的exe程序
using (Process proc = new Process())
{
proc.StartInfo.FileName = "/path/打包后的exe名称.exe";
proc.StartInfo.Arguments = “exe参数”;
proc.StartInfo.RedirectStandardError = true;
proc.Start();
string error = proc.StandardError.ReadToEnd();
proc.WaitForExit();
}
上述FileName是打包后的exe绝对路径。error是控制台输出的错误信息,如果程序出错的话。
本人之前的项目HtwMedia(blog.csdn.net/u014220286/article/details/88895867)中就用到了这种调用方式,避免了重写python模块带来的繁重工作量。
点击关注下方公众号,免费获取Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等
▲点击关注-免费领取
推荐阅读
点击 阅读原文 了解更多
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: muyang-0410声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。