Pythonメカニズムとは独立して構築されたネイティブ共有ライブラリ(.dllまたは.so)と、ctypesを使用してctypesにインターフェイスするPythonモジュールがあるとします。ライブラリ。それらを.whlパッケージにビルドする方法はありますか?もしそうなら、どのように?
これが可能であると仮定すると、wheelパッケージをインストールしてpython setup.py bdist_wheel
を使用する必要があると思いますが、setup.pyはどのように見える必要がありますか?
これを実行して、さまざまなプラットフォームのWheelsをプライベートパッケージインデックスにアップロードし、使用しているプラットフォームに適切なものをpipインストールできるようにします。
Edit: Thomas 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
)
注意すべき点がいくつかあります。
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'