返回顶部
首页 > 资讯 > 后端开发 > Python >Nuitka简介:编译和分发Python的更好方法
  • 299
分享到

Nuitka简介:编译和分发Python的更好方法

开发PythonNuitka 2023-05-14 21:05:56 299人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

译者 | 李睿审校 | 孙淑娟随着python越来越受欢迎,其局限性也越来越明显。一方面,编写Python应用程序并将其分发给没有安装Python的人员可能非常困难。解决这一问题的最常见方法是将程序与其所有支持库和文件以及Python运行时

译者 | 李睿

审校 | 孙淑娟

随着python越来越受欢迎,其局限性也越来越明显。一方面,编写Python应用程序并将其分发给没有安装Python的人员可能非常困难。

解决这一问题的最常见方法是将程序与其所有支持库和文件以及Python运行时打包在一起。有一些工具可以做到这一点,例如PyInstaller,但它们需要大量的缓存才能正常工作。更重要的是,通常可以从生成的包中提取Python程序的源代码。在某些情况下,这会破坏交易。

第三方项目Nuitka提供了一个激进的解决方案。它将Python程序编译为C语言二进制文件——不是通过将CPython运行时与程序字节码打包,而是通过将Python指令翻译成C语言。其结果能够以压缩包的形式分发,也可以与其他第三方产品一起打包到安装程序中。

Nuitka还试图保持与Python生态系统的最大兼容性,因此NumPy等第三方库可以可靠地工作。Nuitka还尽可能地对编译后的Python程序进行性能改进,但同样不会牺牲整体兼容性。但不能保证加快速度,因此它们在工作负载之间变化很大,并且某些程序可能不会体验到任何显著的性能改进。一般来说,最好不要依赖Nuitka来提高性能,而是作为捆绑解决方案。

安装Nuitka

Nuitka可以与Python 2.6到2.7和python3.3到3.10配合使用。它可以为Microsoft windowsMacOS、linux和FreeBSD/NetBSD编译二进制文件。需要注意的是,开发人员必须在目标平台上构建二进制文件;不能交叉编译。

对于每个平台,除了需要Python运行时外,还需要一个C编译器。在Microsoft Windows上,建议使用Visual Studio 2022或更高版本,但也可以使用MinGW-w64 C11(GCc 11.2或更高)。对于其他平台,可以在Visual Studio下的Windows上使用gcc 5.1或更高版本g++4.4或更高级别、clang或clang cl。

需要注意的是,如果使用Python 3.3或Python 3.4,由于工具依赖性,将需要Python 2.7。如果可以的话,所有这些都应该成为使用最新版本Python的理由。

最好将Nuitka与项目一起安装在虚拟环境中,作为开发依赖项而不是分发依赖项。Nuitka本身并未与项目捆绑在一起或被其项目使用;它执行捆绑。

首次使用Nuitka

在安装Nuitka之后,使用Nuitka或python-m nuitka调用它。

开发人员想要使用Nuitka做的第一件事是验证整个工具链是否正常工作,包括C编译器。要对此进行测试,可以编译一个简单的“Hello world”Python程序,将其命名为main.py:

print ("Hello world")

使用Nuitka编译Python程序时,将入口点模块的名称作为参数传递给Nuitka,例如Nuitka main.py。当这样调用时,Nuitka将接收main.py并从中构建一个可执行文件。

需要注意的是,因为只是在测试Nuitka的功能,所以它只会将该Python文件编译为可执行文件。它不会编译任何其他内容,也不会捆绑任何内容以进行重新分发。但是编译一个文件应该足以确定Nuitka的工具链是否设置正确。

在编译完成后,应该会看到与Python程序位于同一目录中的二进制可执行文件。运行可执行文件以确保其正常工作。

还可以通过将--run作为命令行标志传递自动运行Nuitka编译的应用程序。

如果“Hello world”测试可执行文件有效,可以尝试将其打包为可再发行文件。以下解释这个过程。

需要注意的是,当使用Nuitka运行第一个测试编译时,它可能会在几秒钟内完成。而这只编译一个模块,而不是整个程序。使用Nuitka编译完整的程序可能需要几分钟或更长时间,具体取决于程序使用的模块数量。

使用Nuitka编译Python程序

在默认情况下,Nuitka只编译指定的模块。如果模块有来自程序中其他地方、标准库或第三方包的导入,则需要指定也应该编译这些导入。

考虑修改后的“Hello world”程序,其中有一个名为greet.py的相邻模块:

def greet(name):
print ("Hello ", name)

和修改后的main.py:

import greet
greet.greet("world")

要编译这两个模块,可以使用--follow-imports开关:

nuitka --follow-imports main.py

该开关确保整个程序所需的所有导入都从导入语句中跟踪并一起编译。

另一个选项--nofollow-import-to允许从导入过程中排除特定的子目录。这一选项对于筛选出知道从未使用过的测试套件或模块很有用。它还允许提供通配符作为参数。

Nuitka简介:编译和分发Python的更好方法

图1.使用Nuitka编译大型复杂程序。这个示例涉及编译Pyglet模块以及标准库中的许多模块,这需要几分钟的时间

(1)包括动态导入

现在出现了Python用户在尝试打包Python应用程序以进行分发时经常遇到的问题之一。--follow-imports选项仅遵循通过import语句在代码中显式声明的导入。它不处理动态导入。

为了解决这个问题,可以使用--include-plugin-directory开关为动态导入的模块提供一个或多个路径。例如,对于包含动态导入代码的名为mods的目录,可以使用:

nuitka--follow-imports--include-plugin-directory=modsmain.py

(2)包括数据文件和目录

如果Python程序使用在运行时加载的数据文件,Nuitka也无法自动检测这些文件。要将单个文件和目录包含在Nuitka打包程序中,可能使用--include-data-files和--include-data-dir。

--include-data-files允许为要复制的文件指定通配符以及要将它们复制到的位置。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。

-include-data-dir的工作方式大致相同,只是它不使用通配符;它只允许传递要复制的路径和要将其复制到的分发文件夹中的目标。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。

(3)包括Python包和模块

指定导入的另一种方法是使用Python样式的包命名空间而不是文件路径,使用--include-package选项。例如,以下命令将包括mypackage,它在磁盘上的任何位置(假设Python可以找到它),以及它下面的所有内容:

nuitka --include-package=mypackage main.py

如果包需要自己的数据文件,可以使用--include-package-data选项包含这些文件:

nuitka --include-package=mypackage --include-package-data=mypackage main.py

该命令告诉Nuitka获取包目录中实际上不是代码的所有文件。

如果只想包含单个模块,可以使用--include-module:

nuitka --include-module=mypackage.mymodule main.py

该命令告诉Nuitka只包含mypackage.mymodule,而不包含其他内容。

编译Python程序进行重新分发

当想用Nuitka编译Python程序以进行重新分发时,可以使用命令行开关--standalone来处理大部分工作。此开关自动跟随所有导入并生成一个dist文件夹,其中包含已编译的可执行文件和所需的任何支持文件。要重新分发程序,只需要复制此目录即可。

不要指望--standalone的程序在第一次运行时就可以工作。Python程序的一般动态性几乎保证了需要使用上述其他一些选项来确保编译的程序正常运行。例如,如果有一个需要特定字体的GUI应用程序,可能必须使用--include-data-files或--include-data-dir将它们复制到发行版中。

此外,如上所述,--standalone应用程序的编译时间可能比测试编译长得多。一旦对测试独立构建的应用程序需要多长时间有所了解,就为测试独立构建的应用程序所需的构建时间进行预算。

最后,Nuitka提供了另一个构建选项--onefile。对于那些熟悉PyInstaller的人来说,--onefile的工作方式与该程序中的相同选项相同:它将整个应用程序(包括其所有依赖文件)压缩为单个可执行文件,无需重新分发其他文件。但是,重要的是要知道--onefile在Linux和Microsoft Windows上的工作方式不同。在Linux上,它使用存档的内容安装一个虚拟文件系统。在Windows上,它会将文件解压缩到一个临时目录中并从那里运行它们,它必须为程序的每次运行执行这一操作。在Windows上使用--onefile可能会显著降低启动程序所需的时间。

原文标题:​​Intro to Nuitka: A better way to compile and distribute Python​​,作者:Serdar Yegulalp

以上就是Nuitka简介:编译和分发Python的更好方法的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Nuitka简介:编译和分发Python的更好方法

本文链接: https://lsjlt.com/news/205656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Nuitka简介:编译和分发Python的更好方法
    译者 | 李睿审校 | 孙淑娟随着Python越来越受欢迎,其局限性也越来越明显。一方面,编写Python应用程序并将其分发给没有安装Python的人员可能非常困难。解决这一问题的最常见方法是将程序与其所有支持库和文件以及Python运行时...
    99+
    2023-05-14
    开发 Python Nuitka
  • 简单介绍mysql5.6的编译安装方法
    下面一起来了解下mysql5.6的编译安装方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql5.6的编译安装方法这篇短内容是你想要的。mysql wget http://dev.my...
    99+
    2024-04-02
  • 简单介绍区分applet和application的方法
            Java语言是一种半编译半解释的语言。Java的用户程序分为两类:Java Application和Java Applet。这两类程序在组成结构和执行机制...
    99+
    2023-05-31
    java applet application
  • Python下编译py成pyc和pyo的方法
    本篇内容主要讲解“Python下编译py成pyc和pyo的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python下编译py成pyc和pyo的方法”吧!什么是pyc文件pyc是一种二进制文...
    99+
    2023-06-04
  • Python的Flask框架的简介和安装方法
    请在开始使用 Flask 之前阅读本文。也希望本文能够回答关于 Flask 项目的初衷以及目标,以及 flask 适用的场景(情境)等问题。 什么是 “微”? “微” (“Micro”) 并不是意味着把整个...
    99+
    2022-06-04
    框架 简介 方法
  • Python安装pyinstaller和编译exe文件的方法
    这篇文章主要讲解了“Python安装pyinstaller和编译exe文件的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python安装pyinstaller和编译exe文件的方法”吧...
    99+
    2023-06-02
  • 3种编写Python的好方法分别是什么
    今天就跟大家聊聊有关3种编写Python的好方法分别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这里小芯就给大家推荐3种编写Python的好方法,它们能帮你成为更好的程序员。...
    99+
    2023-06-05
  • Python shell 和分布式编程算法:如何让它们更好地协作?
    Python shell 和分布式编程算法在日常的编程工作中都占有重要的地位。但是,如果没有一个良好的协作方式,这两种技术将很难发挥其最大的作用。本文将介绍如何通过一些实用的方法和技巧,让 Python shell 和分布式编程算法更好地...
    99+
    2023-10-08
    shell 分布式 编程算法
  • Python简单实现Base64编码和解码的方法
    本文实例讲述了Python简单实现Base64编码和解码的方法。分享给大家供大家参考,具体如下: Base64编码是一种“防君子不防小人”的编码方式。广泛应用于MIME协议,作为电子邮件的传输编码,生成的编...
    99+
    2022-06-04
    简单 方法 Python
  • Linux 上的 Python 编程和算法开发,有哪些好处?
    作为一种自由和开放的操作系统,Linux 为 Python 编程和算法开发提供了许多优势。无论你是新手还是经验丰富的 Python 开发人员,使用 Linux 平台都可以带来很多好处。本文将介绍 Linux 上的 Python 编程和算法开...
    99+
    2023-09-20
    git 编程算法 linux
  • Python中lambda表达式的简要介绍和详细使用方法
    Python中lambda函数的简介与用法详解 在Python中,lambda函数是一种特殊的匿名函数,它可以在需要函数对象的任何地方使用。lambda函数通常用来定义一些简单的函数,它们可以只有一个表达式,并且返回结果。本文将...
    99+
    2024-02-02
    简介 用法详解
  • 简介Python设计模式中的代理模式与模板方法模式编程
    代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 python...
    99+
    2022-06-04
    模式 模板 简介
  • Python利用itchat对微信中好友数据实现简单分析的方法
    前言 最近在一个微信公众号上看到一个调用微信 API 可以对微信好友进行简单数据分析的一个包 itchat 感觉挺好用的,就简单尝试了一下。 库文档说明链接在这: itchat 安装 在终端中输入以下命令,...
    99+
    2022-06-04
    信中 好友 简单
  • Python中并发编程路径API的使用方法和技巧有哪些?
    Python是一种高级编程语言,广泛应用于Web开发、数据分析、机器学习等领域。在Python中,对于需要同时执行多个任务的应用程序,我们可以使用并发编程来提高程序的效率。Python中提供了多种并发编程路径API,本文将介绍这些API的...
    99+
    2023-06-29
    并发 path api
  • Python并发编程中的进程池,了解进程池的使用方法和优势
    进程池是Python中一个用于多进程编程的工具。它可以创建多个进程,并将其分配到不同任务中,从而提高程序的执行效率。进程池的使用非常简单,只需要几行代码即可创建一个进程池,然后将任务分配给进程池,进程池会自动创建进程并执行任务。 创建进...
    99+
    2024-02-05
    Python 进程池 多进程编程 并发编程 性能优化
  • 怎么分析网站开放中排名不好和快照不更新的原因及解决方法
    怎么分析网站开放中排名不好和快照不更新的原因及解决方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先就是网站内容的更新,网站内容更新对于百度快照是非常有帮助...
    99+
    2023-06-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作