26

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

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

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

4

2 に答える 2

41

編集: Thomas Dによって提案された新しいバージョンの wheel 用に更新されました。

ここに方法があります。たとえば、これは 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. このホイールに拡張モジュールがあり、ホイールが Windows 上に構築されているため、これが win32 ホイールであることを示すカスタムdistclass が使用されます。

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

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

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

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

>>> import md5
>>> md5.digest('hello')
'8d11aa0625ce42cfe9429d5e93b5ab0a'
于 2014-07-17T00:45:32.910 に答える
11

選択した回答は執筆時点では正しいものでしたが、このプル リクエストによりこの機能が壊れました。

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

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

于 2016-11-01T21:30:28.190 に答える