python: pythonスクリプトから実行ファイルを作る、あるいはDLLに作る方法 (nuitka)

Pythonから実行形式のファイル、あるいはDLL1や .so などの動的リンクライブラリを nuitka を用いて作成する方法について。

Pythonスクリプトの隠蔽を目的とする場合は暗号化が必要であると思うが、その場合商用ライセンスが必要となる点に注意。

環境は Python 3.9.5 on Windows 10

方法

インストール

この作業は以降のいずれのパターンをとる場合でも必要。

nuitkaorderedset をインストールする。

pip install nuitka
pip install orderedset

実行形式ファイルの作成 (Python dllが必要なバージョン)

注意: この方法は配布先のマシンでも同VersionのPthonがインストールされている必要がある。配布先にその負担をかけたくない場合は次項参照。

nuitka を利用して対象の python スクリプトファイルから動的リンクライブラリを作成する。 script.py は対象ファイル名に置き換える。

python -m nuitka script.py

pip でインストールしたライブラリもファイルに含める場合には以下を実施。

python -m nuitka --follow-imports script.py

その代わり、コンパイル時間は長くなる。

実行形式ファイルの作成 (stand aloneバージョン)

python -m nuitka --standalone script.py

この方法では配布先に負担をかけない代わりにコンパイル時間が非常に長くなる。

動的リンクライブラリの作成

python -m nuitka --module script.py

これにより作成されるファイルは *.pyd であるが、これは基本的にWindowsで言う *.dll といった動的ライブラリと仕組みは同じである。特定の必須関数が実装されている必要があるなどの細かい制約はある2

その他注意点

別途ファイルのデータを読み出す、といった作業をする場合にはそのファイルを含めるかどうかなども設定ができる。

設定できる内容がプラットフォームなどにも依存するため、実際に利用される際には公式ドキュメント参考のこと。

説明

Nuitka について

Nuitka は Pythonをコンパイルするためのライブラリ。公式リポジトリからを見ると

Nuitka translates the Python modules into a C level program that then uses libpython and static C files of its own to execute in the same way as CPython does.

日本語訳 (カッコ書きの中身は訳者注)

Nuitka は Python module を C言語レベルの libpython を利用するプログラムとそれ(Python module?)が利用する静的C言語ファイルに変換し、CPythonが行っているのと同じように(コンパイルする?)

なんだか妙な文だが、コンセプトはわかる。

公式サイトによれば、

Nuitka is the optimizing Python compiler written in Python that creates executables that run without an need for a separate installer.

日本語訳 (カッコ書きの中身は訳者注)

Nuitka はPythonで記述された最適化された(現在進行形になってるがたぶん過去分詞) Pythonコンパイラです。インストーラ不要の実行ファイルを生成することができます。

調べたところCPythonをベースとした、PythonスクリプトをC言語化するプロジェクト。暗号化をはじめとするいくつかの機能はCommercial Version(有料バージョン)を利用する必要があるようだ。 実行ファイル化 / 動的リンクライブラリ化の目的がコードの隠蔽であればこちらのオプションを利用する方が安全か。


  1. Windows上でコンパイルを実施する関係上、Visual Studio あるいは Build Tool のインストールが必要。商用利用をする際にはVisual Studio のラインセンスを持っている必要がある。 ↩︎

  2. Pythonの公式ドキュメントのFAQにこの内容の記載がある。 ↩︎

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい