python打包和运行技巧

一、打包的几种方法

Python 有多种打包方式可用于将脚本打包成可执行文件,以便在没有 Python 解释器的环境中运行。以下是一些常见的 Python 打包方式:

  1. 使用 pyinstallerpyinstaller 是一个常用的第三方工具,可以将 Python 脚本打包成可执行文件。它可以自动检测脚本的依赖项,并将它们一起打包成一个独立的可执行文件。

  2. 使用 py2exepy2exe 是另一个常用的第三方工具,用于将 Python 脚本打包成可执行文件。它提供了简单的配置选项,可以将所有的依赖项打包到一个文件夹中,并生成一个可执行文件。

  3. 使用 cx_Freezecx_Freeze 是一个用于将 Python 脚本打包成可执行文件的第三方库。它可以将脚本及其依赖项打包成一个目录结构,并生成一个可执行文件。

  4. 使用 NuitkaNuitka 是一个用于将 Python 脚本编译成 C/C++代码的工具。它可以将脚本编译为独立的可执行文件,而不需要 Python 解释器。

  5. 使用 py2apppy2app 是用于在 Mac 上将 Python 脚本打包成可执行文件的工具。它可以将脚本及其依赖项打包成一个应用程序包。

这些工具都有各自的特点和用法,你可以根据自己的需求选择其中之一来打包你的 Python 脚本。请注意,打包过程可能会涉及到一些配置和依赖项的处理,具体使用方法请参考各个工具的官方文档。

Pyinstaller 打包

(1)先安装 pyinstaller

pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com pyinstaller

(2)再执行打包

# -w 可以隐藏控制台输出
pyinstaller --clean -w -F 文件名.py

打包后的 windows 可执行程序将会出现在当前运行程序的 dist 文件夹下。

(3)缩小体积

首先安装 pipenv

pip install pipenv

安装完成后即可创建虚拟环境并进入打包

#建立虚拟环境
pipenv install
#进入虚拟环境
pipenv shell
#安装模块
pip install 小工具.py里面用到的模块
#打包的模块也要安装
pip install pyinstaller
#开始打包
pyinstaller -Fw main.py

#退出环境
exit

#删除虚拟环境
pipenv --rm

在这里插入图片描述

发现没有用 UPX 压缩,下载 UPX 再利用 UPX 压缩,在 https://upx.github.io/里面下载自己想要的版本 。

下载下来的是一个压缩包,我们只需要解压后把里面的 upx. Exe 文件复制到 pyinstaller. Exe 同个文件夹(一般是Scripts文件夹)内即可。Pyinstaller 默认会从执行目录里搜索 upx 执行文件,如果找到 upx,会对生成的可执行文件进行压缩。

重新执行 pyinstaller 打包命令,如果像下图这样就说明使用 upx 配置成功

在这里插入图片描述

Nuitka 打包

Nuitka 是一个 Python 到 C++编译器,它通过将 Python 代码转换为 C++代码并编译成二进制可执行文件来实现性能优化,Nuitka 能够提供比原生 Python 解释器更高的性能和更好的体积。它的工作原理可以简要概括如下:

  1. 解析和转换:Nuitka 首先解析 Python 源代码,并将其转换为中间表示形式。在这个过程中,它会将 Python 的动态特性转化为静态的 C++代码。

  2. 代码优化:在转换过程中,Nuitka 会应用各种优化技术来提高生成的 C++代码的性能。这些优化包括常量折叠、代码内联、循环展开等。

  3. 生成 C++代码:一旦优化完成,Nuitka 将生成 C++代码,并将其保存到磁盘上的一个临时目录中。

  4. 编译成可执行文件:生成的 C++代码会被传递给 C++编译器,如 GCC 或 Clang,以生成最终的二进制可执行文件。在这个过程中,C++编译器会将 C++代码编译成机器码,并与必要的库连接。

Nuitka 主程序安装

使用 pip 安装 NuitkaNuitka 是一种优化的 Python 编译器,可以使用以下命令安装它:

pip install nuitka
使用 Nuitka 打包

打包过程会提示安装依赖环境,跟着提示安装即可。

# --windows-mode关闭控制台窗口;--enable-plugin=tk-inter启用tk,否则无法显示图形界面
nuitka --windows-disable-console --enable-plugin=tk-inter --output-dir=package --standalone your_script.py

Nuitka常用命令:
--windows-disable-console   #不显示控制台窗口
--windows-icon=ICON_PATH  #添加ico
--nofollow-imports  # 所有的import不编译,交给python3x.dll执行
--follow-import-to=need  #need为你需要编译成C/C++的py文件夹命名
--mingw64  #mingw(官方建议编译器)
--standalone #独立环境,这是必须的(否则拷给别人无法使用)
--windows-disable-console #没有CMD控制窗口
--output-dir=out #生成文件路径
--show-progress #显示编译的进度,很直观
--show-memory #显示内存的占用
--include-qt-plugins=sensible,styles #打包后PyQt的样式就不会变了
--plugin-enable=qt-plugins #需要加载的PyQt插件
--plugin-enable=tk-inter #打包tkinter模块的刚需
--plugin-enable=numpy #打包numpy,pandas,matplotlib模块的刚需
--plugin-enable=torch #打包pytorch的刚需
--plugin-enable=tensorflow #打包tensorflow的刚需
--windows-uac-admin=Windows #用户可以使用管理员权限来安装
--onefile  #打包成单个exe文件
Nuitka 依赖环境Winlibs_mingw的安装

打包过程需要 winlibs_mingw,它提供了 gcc 等编译打包的各种环境,如果在线下载失败,可以直接去 github 代理下载,再放到用户目录下‘C:\Users\xxx\AppData\Local\Nuitka\Nuitka‘,这边打包时依赖的是’ https://github.com/brechtsanders/winlibs_mingw/releases/download/11.3.0-14.0.3-10.0.0-msvcrt-r3/winlibs-x86_64-posix-seh-gcc-11.3.0-llvm-14.0.3-mingw-w64msvcrt-10.0.0-r3.zip '。

还有依赖 ccache,这边打包依赖的版本是’ https://github.com/ccache/ccache/releases/download/v4.6/ccache-4.6-windows-32.zip ,ccache 是一个用于缓存编译器输出的工具,可以提高编译的速度。在编译大型项目时,往往需要花费很多时间来重新编译已经编译过的文件。Ccache 通过缓存编译器输出,可以在下次编译相同文件时直接使用缓存,避免了重新编译的过程,从而节省了编译时间。

Nuitka 依赖环境Ccache

Ccache 可以作为一个编译器前端,将编译命令转发给实际的编译器。在编译时,ccache 会检查输入文件是否已经被编译过,并且缓存了编译器的输出。如果文件已经被编译过且没有发生变化,ccache 会直接使用缓存的输出,而不会调用实际的编译器。只有当文件发生了变化或者缓存已经过期时,ccache 才会调用实际的编译器重新编译文件。

使用 ccache 可以显著加快编译的速度,特别是在多次编译相同文件的情况下。它对于开发大型项目或者频繁修改代码的开发者来说特别有用。

Nuitka 依赖环境Depends

如果还需要不依赖 python 环境单独运行,还要下载’ https://dependencywalker.com/depends22_x64.zip '。

打包完成后的文件删减

.cmd 和. Build 打包后都是可以删除的。

.cmd 文件,用于在 Windows 系统上运行打包的可执行文件的一个小脚本。这个脚本负责设置必要的环境变量,并启动打包的可执行文件。

当您使用 Nuitka 打包 Python 代码时,除了生成独立的可执行文件之外,它还会为可执行文件生成一个 .cmd 文件,以便在 Windows 系统上更方便地运行该文件。

您可以通过双击或在命令提示符中运行 .cmd 文件来执行打包的可执行文件,而无需手动设置环境变量或编写额外的脚本。.cmd 文件在运行时将确保正确地设置环境,然后启动打包的可执行文件。

可能遇到的问题
Orderedset 警告
Nuitka:WARNING: Using very slow fallback for ordered sets, please install 'orderedset' PyPI package  
Nuitka:WARNING: for best Python compile time performance.

该警告信息是 Nuitka 的一个提示,它建议您安装 orderedset PyPI 包以获得最佳的 Python 编译时间性能,如果没有装 Microsoft Visual Studio,那建议警告还是不要解决了,需要安装相关环境,文件很大

orderedset是一个用于有序集合的Python库。在某些情况下,Nuitka可能会使用一个较慢的替代方法来处理有序集合,而不是使用orderedset库。这可能会导致编译时间较长。

为了解决这个问题,先安装 Microsoft Visual C++ Build Tools: https://visualstudio.microsoft.com/visual-cpp-build-tools/
安装后,请确保您已经将其添加到系统的环境变量中,以便编译器能够找到必要的文件。然后按照以下步骤安装 orderedset 库,管理员权限在命令行执行:

pip install wheel

pip install orderedset
Tk-inter 警告

Nuitka-Plugins:WARNING: Use ‘–enable-plugin=tk-inter’ for: Tkinter needs TCL included.

这个警告意味着你需要将--enable-plugin=tk-inter作为参数传递给Nuitka来启用Tkinter插件。这是因为Tkinter需要TCL库的支持。

你可以尝试使用以下命令来打包你的程序:

nuitka --enable-plugin=tk-inter your_script.py

这将启用 Tkinter 插件并打包你的程序。

如果没有装 TCL 库,则可以查看并安装 TCL 库,官网:https://www.tcl.tk/ 下载来安装,一般 python 默认有了。

import tkinter as tk

输入以下代码来打印 Tkinter 使用的 TCL 版本:

print(tk.Tcl().eval('info patchlevel'))
# 我的版本是 8.6.12

去掉 py 脚本运行时控制台窗口显示

如果你想在双击 py.pyc 文件运行时不显示控制台窗口,可以通过将文件更名为 .pyw 来实现,各种打包工具会有单独的控制台选项控制,比如 nuitka --windows-disable-console , 这边不做描述。

.pyw 文件是 Python 的无控制台窗口版本,它会在后台运行,不显示任何窗口或控制台输出。

你可以使用以下步骤将 .pyc 文件更名为 .pyw

  1. 找到要更名的 .pyc 文件,例如 script.pyc

  2. 将文件的扩展名 .pyc 更改为 .pyw,即将文件名更改为 script.pyw

  3. 双击 .pyw 文件,它将在后台运行而不显示控制台窗口。

请注意,将 .pyc 文件更名为 .pyw 只是简单地去除了控制台窗口,但并不会对代码进行任何修改或加密。任何有经验的用户仍然可以访问和修改代码。如果需要更高级的保护措施,可以考虑使用其他加密工具或将代码打包为可执行文件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值