Python 打包工具 Nuitka 入门指南

2024-02-26 1184阅读

温馨提示:这篇文章已超过406天没有更新,请注意相关的内容是否还可用!

Nuitka是什么?

nuitka是一个用来将python代码打包为exe可执行文件,方便其在没有相关环境的windows系统上运行的工具。其原理为:将python代码(自己写的部分)转换成C代码,以提高运行的速度。

Python 打包工具 Nuitka 入门指南
(图片来源网络,侵删)

通用选项

  • --standalone 使得打包结果与本地的Python环境无关,即使得打包结果具备可移植性。
  • --onefile 使得打包结果为一个可执行文件,而不是一个文件夹。

    小结:--onefile选项下打出来的包本身就具备可移植性,因此不需要额外加上 --standalone。--onefile 打包结果像绿色软件,仅一个可执行文件;--standalone的打包结果像经过安装的软件,文件夹下包含运行所需要的文件和程序入口。

    • --lto用于启用链接时间优化。链接时间优化是一种编译器优化技术,它可以在编译和链接阶段对整个程序进行优化,而不仅仅是对单个源文件进行优化。通过启用lto,您可以让编译器在链接时对生成的目标代码进行更深入的优化,提高程序的性能和执行效率
    • --remove-output 在打包结束后,清理打包过程中生成的临时文件。
    • --enable-plugin= 启用插件,等号后跟插件名。在要打包的Python代码使用了一些特殊的包时,需要启用插件,Nuitka才能够正确打包。如:如在代码中使用了PySide6,就需要加上--enable-plugin=pyside6。具体的插件列表可以使用nuitka --plugin-list来查看。
    • --disable-console 在运行打包后的程序时,不会弹出控制台,而是直接运行GUI程序。
    • --include-package-data= 包含给定软件包名称中的数据文件,等号后软件包名称。有的时候Nuitka并不能正确分析出一些Python软件包所需要使用的数据文件,在运行程序时提示FileNotFoundError等错误,此时就需要使用该选项。如:--include-package-data=ultralytics
    • --include-data-files= 按文件名包含数据文件,等号后的格式为。SRC指的是文件夹的路径,DEST指的是文件夹相对于打包结果的路径,其中DEST只能使用相对路径。如:--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt
    • --include-data-dir= 包含文件夹中的数据文件,等号后的格式为。使用方法与--include-data-files=相同。

      python安装nuitka模块

      pip install -U nuitka

      使用 Nuitka 将简单的 python3 代码编译为一个二进制文件

      python -m nuitka --lto=no --onefile --standalone test1.py

      使用 Nuitka 将简单的 python3 代码编译为带有numpy模块的C代码

      python -m nuitka --lto=no --onefile --standalone --include-module=numpy test1.py

      实用命令

      python -m nuitka --help # 查看 Nuitka 帮助手册
      python -m nuitka --plugin-list # 查看 Nuitka 插件列表

       举例

      python -m nuitka --standalone --remove-output {your_python_program_name}.py
      python -m nuitka --onefile --remove-output {your_python_program_name}.py
      python -m nuitka --standalone --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py
      python -m nuitka --macos-create-app-bundle --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py

      注意事项 

      1.官方文档中提到,相对于直接使用nuitka命令,python -m nuitka是更好的选择。

      Avoid running the nuitka binary, doing python -m nuitka will make a 100% sure you are using what you think you are. Using the wrong Python will make it give you SyntaxError for good code or ImportError for installed modules. That is happening, when you run Nuitka with Python2 on Python3 code and vice versa. By explicitly calling the same Python interpreter binary, you avoid that issue entirely.

       2.用于执行Nuitka的Python解释器最好是CPython,即Python解释器的标准实现。使用Apple Python等Python解释器部分功能将受限。

      It has to be CPython, Anaconda Python.

      You need the standard Python implementation, called “CPython”, to execute Nuitka, because it is closely tied to implementation details of it.

      Nuitka优缺点 

      优点

      1. 对动态链接库的分析相对准确
      2. 打包生成的软件占用空间较小

      缺点

      1. 打包时间相对较长
      2. 有商业版本,需要收费

      命令

      Options:
      --help                		显示此帮助消息并退出
      --version             		显示错误报告的版本信息和重要详细信息,然后退出。默认为关闭。
      --module              		创建一个可执行的扩展模块,而不是一个程序。默认为关闭。
      --standalone          		为输出启用独立模式。这允许您在不使用现有Python安装的情况下将创建的二进制文件传输到其他机器。这也意味着它将变得更大。它暗示了以下选项:"--follow imports"和"--python flag=no_site"。默认为关闭。
      --onefile             		在独立模式之上,启用onefile模式。这意味着不是一个文件夹,而是一个压缩的可执行文件被创建和使用。默认为关闭。
      --python-debug        		是否使用调试版本。Default使用您正在使用的来运行Nuitka,很可能是非调试版本。
      --python-flag=FLAG    		要使用的Python标志。默认值是您用来运行Nuitka的内容,这会强制执行特定的模式。这些选项也存在于标准Python可执行文件中。当前支持:"-S"(别名"no_site")、"static_hashes"(不使用哈希随机化)、"no_warnings"(不给出Python运行时警告)、"-O"(别名为"no_assels")、"no_docstring"(不使用文档字符串)、"-u"(别名为"unbuffered")和"-m"。默认为空。
      --python-for-scons=PATH 	如果使用Python3.3或Python3.4,请提供用于Scons的Python二进制文件的路径。否则,Nuitka可以使用您运行Nuitka的软件,也可以使用Windows注册表中的Python安装。在Windows上,需要Python 3.5或更高版本。在非Windows上,Python 2.6或2.7也可以。
      

      常用选项

      --mingw64 #默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
      --standalone 独立环境,这是必须的(否则拷给别人无法使用)
      --windows-disable-console 没有CMD控制窗口
      --output-dir=out 生成exe到out文件夹下面去
      --show-progress 显示编译的进度,很直观
      --show-memory 显示内存的占用
      --enable-plugin=pyside6  打包pyside6模块的刚需
      --plugin-enable=tk-inter 打包tkinter模块的刚需
      --plugin-enable=numpy 打包numpy,pandas,matplotlib模块的刚需
      --plugin-enable=torch 打包pytorch的刚需
      --plugin-enable=tensorflow 打包tensorflow的刚需
      --windows-icon-from-ico=你的.ico 软件的图标
      --windows-company-name=Windows下软件公司信息
      --windows-product-name=Windows下软件名称
      --windows-file-version=Windows下软件的信息
      --windows-product-version=Windows下软件的产品信息
      --windows-file-description=Windows下软件的作用描述
      --windows-uac-admin=Windows下用户可以使用管理员权限来安装
      --linux-onefile-icon=Linux下的图标位置
      --onefile 像pyinstaller打包成单个exe文件
      --include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子
      --include-module=复制比如when.py 这些以.py结尾的叫模块
      –-include-package-data=包含给定软件包名称中的数据文件,等号后软件包名称。有的时候Nuitka并不能正确分析出一些Python软件包所需要使用的数据文件,在运行程序时提示FileNotFoundError等错误,此时就需要使用该选项。如:--include-package-data=ultralytics
      –-include-data-files= 按文件名包含数据文件,等号后的格式为。SRC指的是文件夹的路径,DEST指的是文件夹相对于打包结果的路径,其中DEST只能使用相对路径。如:--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt
      -–include-data-dir= 包含文件夹中的数据文件,等号后的格式为。使用方法与--include-data-files=相同。
      --follow-import-to=MODULE/PACKAGE  		如果使用该模块,请遵循该模块;如果是一个包,请遵循整个包。可以多次给定。默认为空。
      

      控制结果中包含的模块和包

      --include-package=PACKAGE						包括整个包裹。作为Python命名空间,例如"some_package.sub_package",然后Nuitka会找到它,并将它和在该磁盘位置下找到的所有模块包括在它创建的二进制或扩展模块中,并使其可供代码导入。为了避免不需要的子包,例如测试,您可以这样做"--nofollow import To=*.tests"。默认为空。
      --include-module=MODULE							包括单个模块。将其作为Python命名空间,例如"some_package.some_module",然后Nuitka会找到它,并将其包含在它创建的二进制或扩展模块中,并使其可由代码导入。默认为空。
      --include-plugin-directory=MODULE/PACKAGE 		还包括在该目录中找到的代码,将它们视为一个主文件。覆盖所有其他包含选项。您应该更喜欢其他包含选项,这些选项以名称而不是文件名命名,这些选项通过在"sys.path"中查找内容。此选项仅适用于非常特殊的用例。可以多次给定。默认为空。
      --include-plugin-files=PATTERN 					包括在与图案匹配的文件中。覆盖所有其他跟随选项。可以多次给定。默认为空。
      --prefer-source-code 							对于已经编译的扩展模块,其中既有源文件又有扩展模块,通常使用扩展模块,但最好从可用的源代码编译模块以获得最佳性能。如果不需要,则有--no-preferred源代码来禁用有关它的警告。默认为关闭。
      

      控制到导入的模块

      --follow-imports    					下降到所有导入的模块中。在独立模式下默认为打开,否则为关闭。
      --follow-import-to=MODULE/PACKAGE  		如果使用该模块,请遵循该模块;如果是一个包,请遵循整个包。可以多次给定。默认为空。
      --nofollow-import-to=MODULE/PACKAGE   	即使使用该模块名称,也不要跟随该模块名称;或者,如果包名称在任何情况下覆盖整个包,则覆盖所有其他选项。可以多次给定。默认为空。
      --nofollow-imports  					根本不要进入任何导入的模块,覆盖所有其他包含选项,并且不适用于独立模式。默认为关闭。
      --follow-stdlib     					还可以从标准库中导入模块。这将大大增加编译时间,而且目前还没有经过很好的测试,有时也无法工作。默认为关闭。
      

      OneFile选项

      --onefile-tempdir-spec=ONEFILE_TEMPDIR_SPEC   	将其用作在一个文件模式下解压缩到的文件夹。默认为"%TEMP%/onefile_%PID%_%TIME%",即用户临时目录,并且是非静态的,它将被删除。例如,使用"%CACHE_DIR%%COMPANY%/%PRODUCT%/%VERSION%"这样的字符串,这是一个良好的静态缓存路径,因此不会删除。
      --onefile-child-grace-time=GRACE_TIME_MS   		当停止子项时,例如由于CTRL-C或关机等原因,Python代码会得到一个"KeyboardInterrupt",它可以处理该中断,例如刷新数据。这是以毫秒为单位的时间,在它以艰难的方式杀死孩子之前。单位为毫秒,默认为5000。
      

      数据文件

      --include-package-data=PACKAGE   			当停止子项时,例如由于CTRL-C或关机等原因,Python代码会得到一个"KeyboardInterrupt",它可以处理该中断,例如刷新数据。这是以毫秒为单位的时间,在它以艰难的方式杀死孩子之前。单位为毫秒,默认为5000。
      --include-data-files=DESC  					在分发中按文件名包括数据文件。允许的形式有很多。使用"--include data files=/path/to/file/*.txt=folder_name/some.txt",它将复制单个文件,如果是多个文件,则会抱怨。使用"--include data files=/path/to/files/*.txt=folder_name/",它会将所有匹配的文件放入该文件夹。对于递归复制,有一个具有3个值的表单"--include data files=/path/to/scan=folder_name=**/*.txt",将保留目录结构。默认为空。
      --include-data-dir=DIRECTORY   				在分发中包括完整目录中的数据文件。这是递归的。如果您想要非递归包含,请使用模式检查"--include data files"。一个例子是整个目录的"--include data dir=/path/some_dir=data/some_dir"(用于纯拷贝)。所有文件都将被复制,如果要排除文件,则需要事先将其删除,或者使用"--noinclude data files"选项将其删除。默认为空。
      --noinclude-data-files=PATTERN  			不要包含与给定文件名模式匹配的数据文件。这是针对目标文件名,而不是源路径。因此,要忽略包数据中的文件模式,"package_name"应匹配为"package_name/*.txt"。或者,对于整个目录,只需使用"packagename"。默认为空。
      --list-package-data=LIST_PACKAGE_DATA  		输出为给定包名称找到的数据文件。未完成默认设置。

      DLL文件

      --noinclude-dlls=PATTERN   					不包括与文件名模式匹配的DLL文件鉴于这是针对目标文件名,而不是源文件名路径。因此,忽略包含在软件包"package_name"应匹配为"软件包名称/someDLL.*"。默认为空。            
      --list-package-dlls=LIST_PACKAGE_DLLS   	输出为给定程序包名称找到的DLL。未完成默认设置。
      

      控制Nuitka发出的警告

      --warn-implicit-exceptions  		对编译时检测到的隐式异常启用警告。
      --warn-unusual-code  				对编译时检测到的异常代码启用警告。
      --assume-yes-for-downloads  		如果需要,允许Nuitka下载外部代码,例如依赖walker、ccache,甚至Windows上的gcc。要禁用,请重定向来自nul设备的输入,例如"
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]