假设我有一个独立于任何Python机制构建的本机共享库(.dll或.so),以及一个使用ctypes连接到库的Python模块。有没有办法可以将它们构建成.whl包?如果是这样,怎么样?
假设这是可能的,我想我需要安装wheel包并使用python setup.py bdist_wheel
但是我的setup.py需要看起来像什么?
我想这样做,所以我可以将各种平台的车轮上传到一个私有包索引中,并能够为我所在的平台安装合适的一个。
答案 0 :(得分:31)
修改:根据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)
用pip安装'wheel'之后,我可以运行python setup.py bdist_wheel
来生成dist \ md5-1.0-cp34-none-win32.whl。我碰巧使用的是cpython 3.4,但是如果你想要一个万向轮,你可以添加一个setup.cfg like this one。
现在我可以创建并激活一个新的虚拟环境,pip install md5-1.0-cp34-none-win32.whl,并使用我的包:
>>> import md5
>>> md5.digest('hello')
'8d11aa0625ce42cfe9429d5e93b5ab0a'
答案 1 :(得分:7)