目次
Nuitka のインストール
Nuitka を初めて使用する
Nuitka を使用して Python プログラムをコンパイルする
编译Python程序进行重新分发
ホームページ バックエンド開発 Python チュートリアル Nuitka の紹介: Python をコンパイルして配布するためのより良い方法

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

Apr 13, 2023 pm 12:55 PM
python 開発する nuitka

翻訳者 | 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? 携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? Apr 02, 2025 pm 10:09 PM

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

携帯電話のXMLファイルをPDFに変換する方法は? 携帯電話のXMLファイルをPDFに変換する方法は? Apr 02, 2025 pm 10:12 PM

単一のアプリケーションで携帯電話でXMLからPDF変換を直接完了することは不可能です。クラウドサービスを使用する必要があります。クラウドサービスは、2つのステップで達成できます。1。XMLをクラウド内のPDFに変換し、2。携帯電話の変換されたPDFファイルにアクセスまたはダウンロードします。

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

携帯電話でXMLをPDFに変換する方法は? 携帯電話でXMLをPDFに変換する方法は? Apr 02, 2025 pm 10:18 PM

携帯電話でXMLをPDFに直接変換するのは簡単ではありませんが、クラウドサービスの助けを借りて実現できます。軽量モバイルアプリを使用してXMLファイルをアップロードし、生成されたPDFを受信し、クラウドAPIで変換することをお勧めします。クラウドAPIはサーバーレスコンピューティングサービスを使用し、適切なプラットフォームを選択することが重要です。 XMLの解析とPDF生成を処理する際には、複雑さ、エラー処理、セキュリティ、および最適化戦略を考慮する必要があります。プロセス全体では、フロントエンドアプリとバックエンドAPIが連携する必要があり、さまざまなテクノロジーをある程度理解する必要があります。

XMLを写真に変換する方法 XMLを写真に変換する方法 Apr 03, 2025 am 07:39 AM

XMLは、XSLTコンバーターまたは画像ライブラリを使用して画像に変換できます。 XSLTコンバーター:XSLTプロセッサとスタイルシートを使用して、XMLを画像に変換します。画像ライブラリ:PILやImageMagickなどのライブラリを使用して、形状やテキストの描画などのXMLデータから画像を作成します。

XML形式を確認する方法 XML形式を確認する方法 Apr 02, 2025 pm 10:00 PM

XML形式の検証には、その構造とDTDまたはスキーマへのコンプライアンスを確認することが含まれます。 ElementTree(基本的な構文チェック)やLXML(より強力な検証、XSDサポート)など、XMLパーサーが必要です。検証プロセスでは、XMLファイルを解析し、XSDスキーマをロードし、AssertValidメソッドを実行してエラーが検出されたときに例外をスローすることが含まれます。 XML形式の確認には、さまざまな例外を処理し、XSDスキーマ言語に関する洞察を得る必要があります。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

XMLをMP3に変換する方法 XMLをMP3に変換する方法 Apr 03, 2025 am 09:00 AM

XMLをMP3に変換する手順には、XMLからオーディオデータを抽出します:XMLファイルを解析し、オーディオデータを含むBase64エンコード文字列を見つけ、バイナリ形式にデコードします。オーディオデータをmp3にエンコードします:mp3エンコーダーをインストールし、エンコードパラメーターを設定し、バイナリオーディオデータをmp3形式にエンコードし、ファイルに保存します。

See all articles