• 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
    
    • 1

    (2)再执行打包

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

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

    (3)缩小体积

    首先安装 pipenv

    pip install pipenv
    
    • 1

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

    #建立虚拟环境
    pipenv install
    #进入虚拟环境
    pipenv shell
    #安装模块
    pip install 小工具.py里面用到的模块
    #打包的模块也要安装
    pip install pyinstaller
    #开始打包
    pyinstaller -Fw main.py
    
    #退出环境
    exit
    
    #删除虚拟环境
    pipenv --rm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    发现没有用 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
    
    • 1
    使用 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文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    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.
    
    • 1
    • 2

    该警告信息是 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
    
    • 1
    • 2
    • 3
    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
    
    • 1

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

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

    import tkinter as tk
    
    • 1

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

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

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

  • 相关阅读:
    springboot声明式事务没有生效——警惕springboot声明式事务的坑
    carrier开利触摸屏ICVC控制面板维修CEPL130445
    软件工程——结构化设计
    代码随想录算法训练营19期第58天
    红队专题-Cobalt strike从小白到飞升手册
    算法总结--线段树
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    Ajax学习:同源策略(与跨域相关)ajax默认遵循同源策略
    第三方软件检测机构有哪些资质,2023年软件测评公司推荐
    华为数字化转型之道 认知篇 第二章 数字化转型框架
  • 原文地址:https://blog.csdn.net/south_d/article/details/134031437