web-dev-qa-db-ja.com

既存のネイティブライブラリからPython Wheelを作成するにはどうすればよいですか?

Pythonメカニズムとは独立して構築されたネイティブ共有ライブラリ(.dllまたは.so)と、ctypesを使用してctypesにインターフェイスするPythonモジュールがあるとします。ライブラリ。それらを.whlパッケージにビルドする方法はありますか?もしそうなら、どのように?

これが可能であると仮定すると、wheelパッケージをインストールしてpython setup.py bdist_wheelを使用する必要があると思いますが、setup.pyはどのように見える必要がありますか?

これを実行して、さまざまなプラットフォームのWheelsをプライベートパッケージインデックスにアップロードし、使用しているプラ​​ットフォームに適切なものをpipインストールできるようにします。

20
Eric Smith

EditThomas D によって提案されたように、新しいバージョンのホイール用に更新されました。

ここに方法があります。たとえば、これはlibeay32.dllを使用してmd5パッケージを公開します。

プロジェクトの構造は次のとおりです。

MD5
│   setup.py
│
└───md5
    __init__.py   
    libeay32.dll

Setup.pyは次のとおりです。

from setuptools import setup, Distribution


class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True


setup(
    name='md5',
    version='1.0',
    description='MD5 Library',
    packages=['md5'],
    package_data={
        'md5': ['libeay32.dll'],
    },
    distclass=BinaryDistribution
)

注意すべき点がいくつかあります。

  1. DLLはパッケージデータとしてリストされているため、ホイールに含まれます。
  2. カスタムdistclassが使用されます これは、このホイールに拡張モジュールがあり、ホイールがWindowsで構築されているため、これがwin32ホイールであることを示します。

Python ctypesコードはそれ自体に対してDLLをロードできます(このコードは__init.py__にあります):

lib_path = os.path.join(os.path.dirname(__file__), 'libeay32.dll')
lib = CDLL(lib_path)

'wheel'をpipでインストールした後、python setup.py bdist_wheelを実行してdist\md5-1.0-cp34-none-win32.whlを生成できます。私はたまたまcpython3.4を使用していますが、ユニバーサルホイールが必要な場合は、setup.cfg このように を追加できます。

これで、新しい仮想環境を作成してアクティブ化し、pip install md5-1.0-cp34-none-win32.whlを実行して、パッケージを使用できます。

>>> import md5
>>> md5.digest('hello')
'8d11aa0625ce42cfe9429d5e93b5ab0a'
32
Eric Smith

選択した回答は執筆時点では正しかったのですが、 このプルリクエスト はこの機能を壊しました。

この回答 新しいバージョンのホイールパッケージでこの問題を正しく解決すると思います。

(これをコメントとして追加したはずですが、必要な評判が不足しています。)

8
Thomas D