tkinter - 使用Pyinstall进行打包封装

article/2025/10/11 15:48:31

1 需要安装 PyInstaller

C:\Users\30818>  pip install pyinstaller

2 将模块py文件打包成pyd 防止反编译暴露源代码  pyd是一个模块插件 可以通过 Import 来引入pyd文件 直接编译会提示二进制读取错误

2-1 安装cython 

pip install cython

2-2 在当前目录创建一个 setup.py 的文件  文件名可以随意 写入如下代码

#!/usr/bin/python3.7 
# -*- coding: utf-8 -*-  from distutils.core import setup
from Cython.Build import cythonizesetup(#name名无实际作用可以随意写name='api_sign', #cythonize()是将Python代码转换成C代码的API 下方替换成需要转换的Py文件ext_modules=cythonize("online_update.py"))

2-3 cmd中运行如下代码进行操作

#需要先切换到文件所所在位置路径
D:\>cd SDM_FILE\web_model\tkinter_library\helloworld 
D:\SDM_FILE\web_model\tkinter_library\helloworld>  python setup.py build_ext --inplace

2-4 运行时可能会提示错误 unable to find vcvarsall.bat

我是 python 3.7.8  安装 vs2015 或者 2017 都可以 这边安装的是vs2017 安装时一定要勾选 使用C+桌面开发

同时也有可能遇到  setuptools 工具问题 

pip uninstall setuptools  然后再   pip install setuptools -upgrade 

2-5 运行完成后  再对应目录下  如helloworld/online_update.cp37-win_amd64.pyd 即可查看到 pyd文件  

删除build、disk文件夹 将pyd文件移出来重新进行打包即可 py源文件不用删除 因为当同时存在mylib.pyd和mylib.py时,引入优先级是pyd>py,所以不用移除py文件,默认引入时就是pyd

3-1 此时已经可以直接编译了

# -F  生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内
# -w  禁止Windows的命令行窗口。不然双击exe时会打开一个黑乎乎的dos窗口;
# -i  生成的exe文件会带有这个图标,有识别度也更好看
#直接编译
D:\helloworld\online_update>  pyinstaller -i animo03.ico -Fw main.py

    执行失败错误一   Failed to execute script main

    

# 再次运行下方代码  运行完成后 会在dist 目录 生成一个目录
# cd进入该目录,用cmd 命令行窗口 执行对应的.exe 就能看到错误了
# 确认错误后根据错误排查pyinstaller -D main.py#如提示icon图标未找到 将图表放入相同文件中即可

3-2 也可以进一步生成spec后再进行编译  进入文件夹目录 将主文件main.py 添加一个图标文件 并生成spec 配置文件

#制作spec文件
C:\Users\30818\Desktop\imgdownload>  pyi-makespec --icon animo03_128x128.ico -Fw --hidden-import online_update.pyd main.py#输入对应参数 生成后对应spec文件即已经拥有了对应属性

pyi-makespec 对应参数一览表

  
参数名描述说明

可选参数

  
-h, --help显示帮助消息并退出
--log-level LEVEL生成时控制台消息中的详细信息量。level 等级可以是TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL之一(默认值:INFO)控制编译时pyi打印的信息 也就是默认情况下,不打印TRACE和DEBUG信息
-v显示版本号 
–distpath生成文件放在哪里默认:当前目录的dist文件夹内
–workpath生成过程中的中间文件放在哪里默认:当前目录的build文件夹内
-y如果dist文件夹内已经存在生成文件,则不询问用户,直接覆盖默认:询问是否覆盖
–upx-dir UPX_DIR指定upx工具的目录默认:execution path
-a不包含unicode支持默认:尽可能支持unicode
–clean在本次编译开始时,清空上一次编译生成的各种文件默认:不清除

生成什么

  
-D, --onedir

结果是一个目录,各种第三方依赖、资源和exe同时存储在该目录  在dist 中可以直接运行生成的exe 调试错误

 
-F, --onefile创建一个文件绑定的可执行文件。  结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内 
--specpath DIR指定.spec文件的存储路径 (默认:当前目录) 
-n NAME, --name NAME生成的.exe文件和.spec的文件名 (默认:第一个脚本的基础名 如 main.py 那么名称为 main.spec  main.exe) 

捆绑的内容 搜索的位置

  
–add-data打包额外资源用法:pyinstaller main.py --add-data=src;dest。windows以;分割,linux以:分割
–add-binary打包额外的代码用法:同–add-data。与–add-data不同的是,用binary添加的文件,pyi会分析它引用的文件并把它们一同添加进来
-p DIR, --paths DIR指定额外的import路径,类似于使用PYTHONPATH参见PYTHONPATH

--hidden-import MODULENAME

--hiddenimport MODULENAME

打包额外py库pyi在分析过程中,有些import没有正确分析出来,运行时会报import error,这时可以使用该参数
--additional-hooks-dir HOOKSPATH指定用户的hook目录hook用法参见其他,系统hook在PyInstaller\hooks目录下
--runtime-hook RUNTIME_HOOKS指定用户runtime-hook如果设置了此参数,则runtime-hook会在运行main.py之前被运行
--exclude-module EXCLUDES需要排除的modulepyi会分析出很多相互关联的库,但是某些库对用户来说是没用的,可以用这个参数排除这些库,有助于减少生成文件的大小
–keypyi会存储字节码,指定加密字节码的key16位的字符串
如何生成  

-d {all,imports,bootloader,noarchive}

--debug {all,imports,bootloader,noarchive}

执行生成的main.exe时,会输出pyi的一些log,有助于查错默认:不输出pyi的log
-s, --strip优化符号表原文明确表示不建议在windows上使用
–noupx强制不使用upx默认:尽可能使用
--upx-exclude FILE使用时防止压缩二进制文件upx。这个通常在upx在压缩期间损坏某些二进制文件时使用。FILE是没有路径的二进制文件的文件名。此选项可以多次使用 

Windows和Mac特有的选项

  
-c, --console, --nowindowed显示命令行窗口与-w相反,默认含有此参数
-w, --windowed, --noconsole不显示命令行窗口编写GUI程序时使用此参数有用。

-i <FILE.ico or FILE.exe,ID or FILE.icns>

--icon <FILE.ico or FILE.exe,ID or FILE.icns>

为main.exe指定图标pyinstaller -i beauty.ico main.py

Windows特有的选项

  
--version-file FILE添加版本信息文件pyinstaller --version-file ver.txt
 -m <FILE or XML>, --manifest <FILE or XML>添加manifest文件 或者  XML 文件到exe 
-r RESOURCE, --resource RESOURCE向Windows可执行文件添加或更新资源。资源是一到四个项目,文件[,类型[,名称[,语言]]]。文件可以是数据文件或exe/dll。对于数据文件,至少必须指定类型和名称。语言默认为0,也可以指定为通配符*以更新给定类型和名称的所有资源。对于exe/dll文件,如果省略类型、名称和语言或将其指定为通配符*,则文件中的所有资源都将添加/更新到最终可执行文件中。此选项可以多次使用。 
--uac-admin使用此选项将创建一个清单,该清单将在应用程序重新启动时请求提升 
--uac-uiaccess使用此选项允许提升的应用程序与远程桌面一起工作 

很少使用的特殊选项

  
--runtime-tmpdir PATH在“onefile”模式下从何处提取库和支持文件。如果给定此选项,引导加载程序将忽略运行时操作系统定义的任何临时文件夹位置。“u MEIxxxxxx”文件夹将在此处创建。只有当你知道你在做什么时,请使用这个选项指定运行时的临时目录, 默认:使用系统临时目录
--bootloader-ignore-signals告诉引导加载程序忽略信号,而不是将它们转发给子进程。在这样的情况下非常有用,例如,一个管理程序进程同时向引导加载程序和子进程发送信号(例如,通过进程组),以避免向子进程发送两次信号 

4 修改spec配置文件

# -*- mode: python ; coding: utf-8 -*-block_cipher = None#分析文件
#多个文件或者其他文件在这里添加
a = Analysis(['main.py','其他.py'],#生成路径pathex=['C:\\Users\\30818\\Desktop\\imgdownload'],# 非python模块的二进制文件# DLL,动态库,共享对象文件等,PyInstaller将在其中搜索其他 二进制依赖项。# 空的list,把要添加的资源文件以tuple的形式传入,tuple的第一个元素是资源文件的路        # 径,第二个元素是打包后存放资源的文件夹。比如:# ('./bin/pdftotext.exe', 'bin')## 就是把 './bin/pdftotext.exe' 打包后放到bin目录下面。## 如果运行找不到程序 注意# 注意以下情况# 最终的exe文件有可能放在任何目录执行,其当前目录下不会有bin目录下面的资源文件,而 # 是被解压到了临时目录下面,所以程序报错找不到相关文件binaries=[],# 需要应用的文件 如资源图片文件等# 如 需要将readme文件添加到 顶层 datas=[ ('src/README.txt', '.') ],# 需要将资源文件 添加到 资源文件夹 datas=[('Resources','Resources')],# .mp3文件夹中的所有文件/mygame/sfx将被复制到sfx捆绑的应用程序中命名的文件夹中# datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ],datas=[],# 隐藏导入的文件 文件变为PYD后可能会找不到引入模块# 所以需要在这里进行引入操作hiddenimports=['test'],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='main',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,#console=False 关闭程序运行时的命令窗口console=True , icon='图片下载助手.ico')

5 编译生成

 --clean  清除pyinstaller的缓存并移除之前建立的临时文件

C:\Users\30818\Desktop\imgdownload>  pyinstaller --clean main.spec

6 pyinstall 参数设置一览 可参考 这里 

7 pyinstall sepc 参数设置一览表

8 常见错误

打包成功后出现"failed to execute pyi_rth_pkgres” 的问题

卸载后尝试重新安装

 

pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

将python程序打包成单文件(使用 -F 参数)后,尝试运行外部文件却提示找不到的问题

当你将python程序打包成单文件(使用 -F 参数)后,运行程序,它实际上是先将exe内的资源文件解压到临时文件夹,然后再运行的,所以会导致这种问题

 

解决方法

 

在spec 文件中 找到data=[]  添加元素,变成了:datas=[('nginx.exe', '.')]
然后用spec打包:pyinstaller main.spec

 

在sepc文件中声明打包后需要注意 打包出来的exe在运行时,它的工作路径和它解压到的路径,是不一样的

通过如下代码查看

 

import os

print(os.getcwd())

 

诸如open('xxx.txt')这些操作文件的函数,一般首先都是在工作路径查找你所指定的文件的。

所以,当我们直接这样执行已打包的外部文件时,程序会报找不到文件!所以请使用它的解压路径。

下面提供一个函数,可以很方便的获取到解压路径

 

import os, sys

def base_path(path):

  if getattr(sys, 'frozen', None):

    basedir = sys._MEIPASS

  else:

    basedir = os.path.dirname(__file__)

  return os.path.join(basedir, path)

 

print(base_path(''))

print(base_path('test\gg.exe'))

 

 

所以当我们在调用已打包的外部文件时,应该先使用os.chdir()将工作路径改为解压路径:

再进行操作,就不会报文件找不到了

 

os.chdir(base_path(''))

win32api.ShellExecute(0, 'open', 'nginx.exe', '', '', 0)

 

 

不过要注意的是,如果你要写出文件到程序所在的目录(非解压目录),那么你得把工作目录改回来,否则文件会被写出到解压路径(临时文件夹)。

稍微封装一下就好了:

 

import os, sys

 

def base_path(path):

  if getattr(sys, 'frozen', None):

    basedir = sys._MEIPASS

  else:

    basedir = os.path.dirname(__file__)

  return os.path.join(basedir, path)

 

tmd = base_path('') # 这是解压路径

cwd = os.getcwd() # 这是程序的所在路径

 

# 当需要调用打包的外部文件时

os.chdir(tmd) # 先把工作路径变成解压路径

do() # 执行你要干的事情

 

# 当需要写出文件到程序所在目录时

os.chdir(cwd) # 把工作路径切换回来

do() # 执行你要干的事情

当你使用cython将py文件编译成pyd文件后使用pyinstaller打包,提示找不到模块的问题

有一个文件main.py,引入了位于同级目录下的test.py模块

 

# main.py:就像这样直接引入

import test

 

 

现在我将test.py 编译成pyd文件,生成了:test.cp37-win_amd64.pyd

这个pyd文件名除了我们原本的文件名test,还会带上编译环境的名称,这个环境后缀名我们可以不用管 ,因为python引入模块还是很智能的(会自动引入.pyd文件,因为它的优先级高于.py文件)。

这么智能,但是为什么我用pyinstaller打包时就提示找不到文件?
其实我们需要在打包时--hidden-import这些模块

 

1、直接添加

在打包时添加--hidden-import test即可
完整命令:pyinstaller -F --hidden-import test

 

2、使用spec文件

同样的,运行一次pyinstaller打包命令后会生成spec文件,打开它
找到hiddenimports=[],添加test模块,变成了:hiddenimports=['test']
很简单对吧?
而且除了我们自己写的一些py模块,其它模块在打包时可能也会提示找不到,都可以用这个方法解决。

 


 


http://chatgpt.dhexx.cn/article/TQAcqnUt.shtml

相关文章

【踩坑日记(一)】: Pyinstall 打包.py文件 生成exe可执行文件

文章目录 Pyinstall 打包.py文件 生成exe可执行文件如何入坑&出坑Analysis 实例其他实例常用参数参考文档&#xff1a;Pyinstall 官方手册 Pyinstall 打包.py文件 生成exe可执行文件 原本认为很轻松的事情&#xff0c;结果花了近2个小时才搞定&#xff0c;值得记录下踩的坑…

Ubuntu 16.04 安装 Pyinstall

Ubuntu 16.04 安装 Pyinstall 预装环境 python3 version&#xff1a;3.5pip version&#xff1a;8.1 报错如下&#xff1a; 首先直接安装 pyinstall 报错&#xff0c;pip 版本过低&#xff0c;要升级版本使用 提供的命令升级 pip&#xff0c;但是开始套娃&#xff0c;一直循…

pyinstall 打包报错

关于使用pyinstaller 打包报错 我的python安装位置为 安装位置/usr/local/python3 关于我的报错环境属于linux 我的pyinstaller 是使用pip 安装的 pip install pyinstaller 在使用pycharm 打包的时候,报错 打包就告诉我缺少什么 关于python的 iso包 我当时有全磁盘搜索该文…

pyinstall exe打包详解

在学习和工作之中&#xff0c;想制作一些小工具&#xff0c;用python秃了一个晚上&#xff0c;拿到公司&#xff0c;发现要安装python才能用&#xff0c;看别人的博客看不懂&#xff0c;别急&#xff0c;一篇搞定。 一、pyinstaller安装 pyinstaller 是一个python库&#xff0…

pyinstall加密打包

这个工具打包真的是挺省事的&#xff0c;但是一旦涉及保护源码&#xff0c;那么原来简单的打包就不够用了。轻易就能被人反编译。 工具自然也是要进步的&#xff0c;现在pyinstall支持加密打包了。 虽然我没查到他加密的原理是什么&#xff0c;但是应该比原来破解增加了一些难度…

PyInstall的安装,使用,以及最后打包成一个exe文件

首先PyInstall安装 pip3 install pyinstaller -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com 打包常用命令 pyinstaller -w -F test.py -w 表示运行exe文件后不出现cmd命令窗口 -F 表示打包成一个单独的exe文件 使用命令后会生成两个文件夹。 …

WIFI传输速度测试

环境&#xff1a; 1.A电脑共享文件&#xff0c;有线1000M&#xff0c;空载&#xff0c;正常机械硬盘&#xff0c;硬盘速度120M/S 2.B电脑从A拷贝数据&#xff0c;USB1.5米延长线接的网卡&#xff0c;USB2.0&#xff0c;WIFI 5G 600M&#xff0c;空载 3.拷贝文件&#xff0c;阿凡…

诺基亚N1 WIFI感叹号消除

Android Captive Portal Server 安卓系统wifi连接后&#xff0c;与CPS服务器通信&#xff0c;检测是否连接到互联网&#xff0c;当不能默认的CPS时就会有感叹号。 通过ADB设置可以消除这个感叹号。 下好ADB之后&#xff0c;打开ADB文件夹&#xff0c;按住shift鼠标右键&…

WIFI理论速度计算

参考&#xff1a; https://cn.ui.vmall.com/thread-1349237-1-4.html 以下是各个WIFI版本的最大吞吐量表 wifi802.11802.11a802.11b802.11g802.11n802.11ac最大吞吐量(Mbps)25411546006928 强调下&#xff0c;MbpsMbit/s即兆比特每秒&#xff08;1,000,000bit/s&#xff09;不…

Android 修改wifi阀值,6种简单方法使WiFi网络提速

6种简单方法使WiFi网络提速 导语:不给力的WiFi连接使得无线上网给人的感觉像是回到了拨号时代。以下是小编精心整理的有关电脑网络知识,希望对大家有所帮助。 1、升级过时的路由器 并非所有人都愿意花钱解决WiFi网速慢的问题,但许多人都需要这么做。最近数年路由器技术取得了…

WIFI 常识

DSSS (Direct Sequence Spread Spectrum)直接序列扩频 FHSS&#xff0c;跳频技术 (Frequency-Hopping Spread Spectrum) FHSS和DSSS比较 跳频扩频&#xff08;FHSS&#xff09;: 跳频扩频&#xff08;FHSS&#xff09;技术是通过“伪随机码”的调制&#xff0c;信息的载波受…

Win10系统正确设置MTU值加快WIFI速度的方法

MTU是Maximum Transmission Unit缩写&#xff0c;中文名&#xff1a;最大传输单元。 工具/原料 硬件&#xff1a;电脑 操作系统&#xff1a;Windows 10 方法/步骤 第一步&#xff1a;查询自己电脑的MTU值 右键【开始】–【命令提示符(管理员)】&#xff1b; netsh interface …

WiFi的真实速率

“虽然许多路由器厂商宣称自家的路由器可以达到极高的速率&#xff0c;但实际上用户购买回去用起来却很难达到很快的速率。因为WiFi传输速率是符合木桶效应的&#xff0c;许多时候速率受限于接入路由器的WiFi终端性能。只有全链路能够达到的速率&#xff0c;才是使用者感受到的…

esp32测试wifi速率

一、下载demo&#xff0c; demo路径esp-idf\examples\wifi\iperf 注意&#xff1a;运行可能会报分区表错&#xff0c;idf.py menuconfig修改下flash为DIO模式再试&#xff1b; 二、测试 1、上电运行demo&#xff0c;PC和esp32连接同一个wifi热点&#xff1b; 2、执行idf.p…

WIFI6速率

WiFi 6在160MHz信道宽度下&#xff0c;单流最快速率为1201Mbit/s&#xff0c;理论最大数据吞吐量9.6Gbps。跟前五代比一比&#xff1a;第一代 802.11b&#xff08;Wi-Fi 1&#xff09;&#xff0c;最快11Mbit/s第二代 802.11a&#xff08;Wi-Fi 2&#xff09;&#xff0c;最快5…

提高企业WiFi速度的快速简便的方法—Vecloud微云

WiFi已成为必不可少的商业工具。连接缓慢或不可靠都会对员工的工作效率和客户服务产生不利影响。 但是&#xff0c;如何确保充分利用无线互联网解决方案呢&#xff1f; 以下是一些提高组织中的WiFi速度的快速简便的方法。 零成本提升WiFi速度的方法 在考虑附有成本的解决方案…

SDIO WiFi问题排查

SDIO WiFi问题排查: SDIO WiFi问题排查 | DDNotes背景 Platform&#xff1a; RK3399 OS&#xff1a; Android7.1.2 Kernel&#xff1a; v4.4.103 问题&#xff1a;Android系统没法打开wifi&#xff0c;10几台机器&#xff0c;有1&#xff0c;2台可以&#xff0c;其他要么一直不…

手机wife修改dns服务器,简单几步DNS设置,让你手机的WiFi速度提升几倍

对于一个手机不离手的人&#xff0c;网速对他/她的重要性不用多说&#xff0c;而WiFi无疑是使用场景最多的连接方式&#xff0c;它的连接速度、下载/上传速度将直接影响我们的使用体验&#xff0c;小编在使用手机的过程中测试了很多针对WiFi的提速方法&#xff0c;要论效果&…

wifi提速技巧:十大方法瞬间提升wifi速度

手机wifi速度慢真是很让人苦恼&#xff0c;有什么有效的wifi提速方法吗?当然有啦~绿茶小编今天就为大家带来了提升wifi速度的十大方法&#xff0c;能激活wifi表现&#xff0c;提升无线网络哦&#xff0c;快来看看吧! 十大方法瞬间提升wifi速度&#xff1a; 每当我们谈到要提高…

手机网速正常电脑很慢_路由器WiFi速度正常,但电脑和手机上网速度慢怎么办?...

不少用户遇到这样的问题&#xff0c;路由器WiFi速度正常&#xff0c;但电脑和手机上网速度慢怎么办&#xff1f;其实是因为你的电脑和手机的缓存需要清理了。 电脑WinR组合键之后输入 services.msc&#xff0c;进入Windows服务&#xff0c;在右侧找到“DHCP Client”和“DNS Cl…