1.Pyinstaller使用
2.怎么样打包pyqt应用才是源码最佳方案?或者说pyqt怎样的发
3.PyInstaller介绍1: 安装与简单使用
Pyinstaller使用
简介
在开发小工具给他人使用时,如果对方系统中没有安装Python环境或缺少第三方库,加密要求对方安装不太现实,源码尤其是加密对方不是技术人员时,此时将开发好的源码脚本通过pyinstaller打包成可执行文件是个不错的选择。
pyinstaller本身支持跨平台使用,加密mymalloc 源码但这里的源码跨平台仅指pyinstaller本身,通过pyinstaller打包出来的加密文件无法跨平台。在MacOS下使用pyinstaller打包Python程序,源码打包后的加密文件只能在MacOS下运行;在Windows下打包的Python程序,只能在Windows下运行。源码
安装pyinstaller最佳使用方式
pyinstaller最重要的加密两个参数是-F与-D参数
使用-F参数,pyinstaller会将Python脚本打包成单个exe文件
使用-D参数,源码pyinstaller会将Python脚本打包成一个文件夹,加密运行程序时,源码需要进入该文件夹,点击运行相应的可执行程序
此前为了美观,开源通过 -i 参数指定程序的icon(图标),但这个命令只在Windows下生效,在MacOS上是没有作用的,同时可以使用 -n 参数定义打包后文件的名称
如果你自己通过PyQt5或tkinter开发了界面,此时通常不希望在运行时弹出命令行,如Windows下的循环依赖源码推荐cmd命令行,此时可以使用-w参数
综上所述,我最常用的命令为
其中 -D 参数或 -F 参数后面跟的是入口文件,即你python xxx.py 运行程序时这个xxx.py文件
对应依赖比较多的程序,建议使用 -D,-F更适合单文件的py脚本。
pyinstaller 打包其实分两步走,第一步,就是通过上面的命令执行打包,此时会生成相应的spec文件,大体流程如下:
1、在脚本目录生成 xxx.spec 文件(看-n参数,没传,则与xxx.py同名为xxx);2、创建一个 build 目录;3、写入一些日志文件和中间流程文件到 build 目录;4、创建 dist 目录;5、生成可执行文件或文件夹到 dist 目录;
效果如下:
第一步完成后,获得xxx.spec,然后再执行
完成打包
进入dist中打包好的文件夹后,直接运行可执行文件则可
上传失败
效果如下:
上传失败
这是一个利用tkinter构建界面的简单程序
spec文件解析
一个spec文件的例子。
spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT.
当PyInstaller自动生成的spec文件无法满足我们的需求时,最常见的java后台扫描源码情况就是我们的程序依赖我们本地的一些数据文件,这个时候就需要我们自己去编辑spec文件来添加数据文件了。上面的spec文件解析中Analysis中的datas就是要添加到项目中的数据文件,我们可以编辑datas.
可以认为datas是一个List,每个元素是一个二元组。元组的第一个元素是你本地文件索引,第二个元素是拷贝到项目中之后的文件名字。除了上面那种写法,也可以将其提出来。
这一节内容来自 pyinstaller简洁教程
注意事项避免打包后,包文件过大
为了避免 pyinstaller 打包后程序或文件夹过大,如:几百kb的程序打包后编程M左右的程序,在引用包时,尽量使用 from ... import ... 语句,这是因为pyinstaller打包的路径其实是将python解释器以及项目中使用的库直接复制过来,所以如果你没事就 import... ,那么pyinstaller会将整个模块复制过去,此时打出来的包就会很大
考虑路径问题
使用python时,要养成使用 os.path.join 的习惯,这不仅可以避免跨平台的路径坑(windows路径表达与类Unix是不同),又可以在打包时不会出现相对路径的问题,很多python程序员编写路径喜欢使用 + 号来链接路径,这会增加项目的传统java项目源码维护成本
pyinstaller 打包的项目遇到路径都使用 os.path.join 则可
外部数据问题
虽然在上节中,提及了使用外部数据时,可以自定义 spec 文件中的 datas 字段,但我更常用的做法是直接将数据复制过去,不去修改datas。
比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可
闪屏结束
如果是简单的程序,可能会出现运行可执行程序后出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。
这种情况要么通过 input() 函数捕捉输入自己主动结束程序,要么就在 cmd 下运行 exe 文件,从而通过 cmd 看到效果
尾
很多人使用 pyinstaller 打包给他人使用时其实是不希望自己源代码被查阅或被修改的,但 pyinstaller 本身并没有加密功能,后面会对 pyinstaller 的反编码进行简单的研究。
怎么样打包pyqt应用才是最佳方案?或者说pyqt怎样的发
早先,多人提及使用PyQt打包应用时遇到的挑战,包括部署困难、大文件体积和启动速度慢等。实际上,使用Python+PyQt打包应用过程极为简便,无需借助复杂工具,手动打包后的聊天app的源码纯净Python环境仅需约5MB,加上PyQt组件也仅MB。
常见错误认知中,许多人偏好使用PyInstaller并加入-F参数,以实现单文件打包。然而,这种做法其实隐藏了自解压程序的特性,每次运行时都会将打包的文件解压至临时目录,然后再执行解压出的程序。使用Process Explorer观察后,可以看到两次运行的pyqt_hello.exe文件,外部文件实为解压结果,内部才是程序核心。观察依赖项python.dll的位置,即为解压后的临时目录,揭示了每次运行时MB文件的临时生成过程。
PyInstaller打包成单文件虽然看似便捷,但存在运行速度慢的问题,不仅因为需要每次解压大量文件,还有杀毒软件对新二进制文件的扫描操作,导致每次运行时需处理额外的扫描任务。
正确的打包策略为手工打包。现在,Python 3.5以后,官方提供嵌入式Python包,大小仅为7MB,解压后是必要的文件。构建时,建立新的runtime文件夹,将这些文件放入,外层使用批处理调用python.exe,以运行命令行程序。若追求更高级的体验,可为嵌入式Python添加壳,直接加载python3.dll或python.dll来运行程序。
PyStand是一个为嵌入式Python设计的壳程序,包含PyStand.exe,它可直接运行,无需配置C/C++编译环境。通过PyStand.int文件加载代码,可将程序名称修改为所需名称,并根据需要重新编译或使用Resource Hacker替换图标。
依赖安装方面,需要一个对应版本的位完整Python 3.8,并创建干净的虚拟环境,将所需包安装在指定目录下。精简依赖时,删除不必要的模块和多余文件,如OpenGL、AxContainer等。同时,清除Python 3.8的bin目录中的大文件和无用组件,如QML、Test、OpenGL等。进一步精简plugins目录,删除无关组件,优化translations目录。最终,整个打包过程减小了文件体积,达到约MB,优于PyInstaller的MB大小。
手工裁剪依赖比使用PyInstaller更可靠,因为它允许更细致的控制,了解每一步操作,便于问题追踪和回退。
二进制压缩可以通过upx工具优化,但要注意python3.dll、vcruntime.dll等文件无法压缩。代码组织上,可将.py文件放入script目录,并创建main.py,实现main方法。编写PyStand.int文件以配置环境和导入main模块。打包后,程序仅包含主目录下的三个文件,易于在其他机器上解压运行。
基础加密策略中,将.py文件打包成.script.egg文件,可减少目录中的.py文件。对于更高安全需求,可将.py文件转换为.pyc文件,进一步压缩成.script.egg。使用cython等工具将关键模块转换为.pyd文件,以增强加密效果。
针对安全性的高级加密措施包括:自定义导入器、加密zip文件、封装pyd/dll至zip或.script.egg文件、静态编译Python及其依赖、修改字节码以及静态编译所有第三方库和Python为exe或dll,减少依赖并集成所有功能。对于额外逻辑代码,可将其压缩加密并添加到唯一可执行文件尾部。
错误调试时,使用PyStand.exe作为窗口程序,可在命令行启动并观察异常,同时记录日志以捕获内部异常。更多相关阅读:为什么许多Python开发者更倾向于使用PyQt和wxPython而非Tkinter?
PyInstaller介绍1: 安装与简单使用
PyInstaller,作为一款广泛使用的Python程序打包工具,将Python应用及其依赖整合成一个可执行包,便于非开发者用户无需额外安装环境即可运行。它支持Python 3.6及以上版本,并兼容诸如numpy、PyQt等主流库。PyInstaller主要针对Windows、Mac OS X和GNU/Linux进行测试,虽然也适用于AIX、Solaris等其他系统,但这些平台的测试不在持续集成范围内。
安装PyInstaller前,确保已具备相应的依赖环境。推荐方法是通过pip安装,如pip不可用,则需从GitHub下载源码并以管理员身份安装。最简单的使用方式是通过命令行,如`pyinstaller --onefile --windowed your_script.py`,这将打包成一个包含窗口的单文件可执行程序。
打包时,PyInstaller会根据脚本中的import语句自动识别依赖,理解Python包的"egg"格式。但如果程序使用了PyInstaller无法检测的导入方式,或者依赖于运行时数据文件,可能需要在.spec文件中手动指定。PyInstaller打包的输出会根据操作系统和Python版本有所差异,所以可能需要为不同的环境准备不同的分发版本。
PyInstaller支持两种打包形式:单文件夹程序和单文件程序。前者依赖引导加载程序,后者则通过.pyw扩展名隐藏控制台窗口。打包后的应用程序隐藏了源代码,但可以通过Cython编译或AES加密进一步保护代码安全。