3. distutilsを使用したCおよびC ++拡張機能の構築—Pythonドキュメント
3.3。 distutilsを使用したCおよびC ++拡張機能の構築
Python 1.4以降、Pythonは、Unix上で、動的にリンクされた拡張機能とカスタムインタープリターを構築するためのmakeファイルを構築するための特別なmakeファイルを提供します。 Python 2.0以降、このメカニズム(Makefile.pre.inおよびセットアップファイルに関連するものとして知られています)はサポートされなくなりました。 カスタムインタプリタの構築はめったに使用されず、拡張モジュールはdistutilsを使用して構築できます。
distutilsを使用して拡張モジュールをビルドするには、distutilsがビルドマシンにインストールされている必要があります。ビルドマシンはPython 2.xに含まれており、Python1.5で個別に利用できます。 distutilsはバイナリパッケージの作成もサポートしているため、ユーザーは拡張機能をインストールするために必ずしもコンパイラとdistutilsを必要としません。
distutilsパッケージには、ドライバースクリプトsetup.py
が含まれています。 これはプレーンなPythonファイルであり、最も単純なケースでは、次のようになります。
from distutils.core import setup, Extension
module1 = Extension('demo',
sources = ['demo.c'])
setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
このsetup.py
とファイルdemo.c
を使用して、実行中
python setup.py build
demo.c
をコンパイルし、build
ディレクトリにdemo
という名前の拡張モジュールを生成します。 システムによっては、モジュールファイルはサブディレクトリbuild/lib.system
になり、demo.so
やdemo.pyd
のような名前になる場合があります。
setup.py
では、すべての実行はsetup
関数を呼び出すことによって実行されます。 これは可変数のキーワード引数を取りますが、上記の例ではサブセットのみを使用しています。 具体的には、この例では、パッケージをビルドするためのメタ情報を指定し、パッケージの内容を指定します。 通常、パッケージには、Pythonソースモジュール、ドキュメント、サブパッケージなどの追加モジュールが含まれます。 distutilsの機能の詳細については、 Pythonモジュールの配布(レガシーバージョン)のdistutilsドキュメントを参照してください。 このセクションでは、拡張モジュールの構築についてのみ説明します。
setup()
の引数を事前に計算して、ドライバースクリプトをより適切に構成するのが一般的です。 上記の例では、setup()
のext_modules
引数は拡張モジュールのリストであり、各拡張モジュールはExtension
のインスタンスです。 この例では、インスタンスはdemo
という名前の拡張子を定義します。これは、単一のソースファイルdemo.c
をコンパイルすることによってビルドされます。
多くの場合、追加のプリプロセッサ定義とライブラリが必要になる可能性があるため、拡張機能の構築はより複雑です。 これは、以下の例で示されています。
from distutils.core import setup, Extension
module1 = Extension('demo',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include'],
libraries = ['tcl83'],
library_dirs = ['/usr/local/lib'],
sources = ['demo.c'])
setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
author = 'Martin v. Loewis',
author_email = '[email protected]',
url = 'https://docs.python.org/extending/building',
long_description = '''
This is really just a demo package.
''',
ext_modules = [module1])
この例では、setup()
が追加のメタ情報とともに呼び出されます。これは、配布パッケージをビルドする必要がある場合に推奨されます。 拡張機能自体については、プリプロセッサ定義、インクルードディレクトリ、ライブラリディレクトリ、およびライブラリを指定します。 コンパイラーに応じて、distutilsはこの情報をさまざまな方法でコンパイラーに渡します。 たとえば、Unixでは、これによりコンパイルコマンドが発生する可能性があります
gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o
gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so
これらの行はデモンストレーションのみを目的としています。 distutilsユーザーは、distutilsが呼び出しを正しく行うことを信頼する必要があります。
3.1。 拡張モジュールの配布
拡張機能が正常にビルドされたら、それを使用する3つの方法があります。
エンドユーザーは通常、モジュールをインストールしたいと思うでしょう、彼らは実行することによってそうします
python setup.py install
モジュールメンテナはソースパッケージを作成する必要があります。 そうするために、彼らは走ります
python setup.py sdist
場合によっては、追加のファイルをソースディストリビューションに含める必要があります。 これはMANIFEST.in
ファイルを介して行われます。 詳細については、distutilsのドキュメントを参照してください。
ソースディストリビューションが正常に構築されている場合、メンテナはバイナリディストリビューションを作成することもできます。 プラットフォームに応じて、次のいずれかのコマンドを使用してこれを行うことができます。
python setup.py bdist_wininst
python setup.py bdist_rpm
python setup.py bdist_dumb