ホームページ >バックエンド開発 >Python チュートリアル >Nuitka の紹介: Python をコンパイルして配布するためのより良い方法

Nuitka の紹介: Python をコンパイルして配布するためのより良い方法

WBOY
WBOY転載
2023-04-13 12:55:062243ブラウズ

翻訳者 | Li Rui

レビュアー | Sun Shujuan

Python の人気が高まるにつれて、その限界がますます明らかになってきました。一方で、Python アプリケーションを作成して、Python がインストールされていない人に配布するのは非常に難しい場合があります。

この問題を解決する最も一般的な方法は、サポートされているすべてのライブラリとファイル、および Python ランタイムを含むプログラムをパッケージ化することです。 PyInstaller など、これを実行できるツールはありますが、適切に動作するには大量のキャッシュが必要です。さらに、多くの場合、生成されたパッケージから Python プログラムのソース コードを抽出できます。場合によっては、これが取引の妨げとなる可能性があります。

サードパーティ プロジェクト Nuitka は根本的なソリューションを提供します。 CPython ランタイムをプログラムのバイトコードとともにパッケージ化するのではなく、Python 命令を C に変換することによって、Python プログラムを C バイナリにコンパイルします。結果は、圧縮パッケージで配布したり、他のサードパーティ製品とともにインストーラーにパッケージ化したりできます。

Nuitka は、Python エコシステムとの互換性を最大限に維持しようとするため、NumPy などのサードパーティ ライブラリも確実に動作します。 Nuitka はまた、可能な限り、コンパイルされた Python プログラムのパフォーマンスを向上させますが、これも全体的な互換性を犠牲にすることはありません。高速化は保証されていないため、ワークロードによって大きく異なり、一部のプログラムでは大幅なパフォーマンスの向上が見られない場合があります。一般に、パフォーマンスに関しては Nuitka に依存せず、バンドルされたソリューションとして依存することが最善です。

Nuitka のインストール

Nuitka は Python 2.6 ~ 2.7 および Python 3.3 ~ 3.10 で使用できます。 Microsoft Windows、macOS、Linux、FreeBSD/NetBSD 用のバイナリをコンパイルできます。開発者はターゲット プラットフォーム上でバイナリをビルドする必要があり、クロスコンパイルは不可能であることに注意することが重要です。

各プラットフォームでは、Python ランタイムに加えて、C コンパイラも必要です。 Microsoft Windows では、Visual Studio 2022 以降を推奨しますが、MinGW-w64 C11 (gcc 11.2 以降) も使用できます。他のプラットフォームの場合は、Windows の Visual Studio で 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 を呼び出します。

開発者が 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 を使用して最初のテスト コンパイルを実行する場合、完了までに数秒かかる場合があることに注意することが重要です。また、これはプログラム全体ではなく、1 つのモジュールのみをコンパイルします。 Nuitka を使用して完全なプログラムをコンパイルするには、プログラムで使用されるモジュールの数に応じて、数分以上かかる場合があります。

Nuitka を使用して Python プログラムをコンパイルする

デフォルトでは、Nuitka は指定されたモジュールのみをコンパイルします。モジュールにプログラム内の他の場所、標準ライブラリ、またはサードパーティのパッケージからのインポートがある場合、これらのインポートもコンパイルするように指定する必要があります。

greet.py:

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

という名前の隣接モジュールと、変更された main.py:

rrree を持つ、変更された「Hello world」プログラムを考えてみましょう。

これら 2 つのモジュールをコンパイルするには、--follow-imports スイッチを使用できます。

import greet
greet.greet("world")

このスイッチにより、プログラム全体が必要とするすべてのインポートが、 import ステートメントを作成し、一緒にコンパイルします。

別のオプション --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 をコンパイルして配布するためのより良い方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。