如何从现有的本机库中创建Python Wheel?

Eri*_*ith 19 python python-wheel

假设我有一个独立于任何Python机制构建的本机共享库(.dll或.so),以及一个使用ctypes连接到库的Python模块.有没有办法可以将它们构建成.whl包?如果是这样,怎么样?

假设这是可能的,我想我需要安装和使用轮组件,python setup.py bdist_wheel但我的setup.py需要看起来像什么?

我想这样做,所以我可以将各种平台的车轮上传到一个私有包索引,并能够为我所在的平台安装合适的一个.

Eri*_*ith 34

编辑:根据Thomas D的建议更新了更新版本的车轮.

这是一种方式.例如,这使用libeay32.dll来公开md5包.

项目结构是:

MD5
?   setup.py
?
????md5
    __init__.py   
    libeay32.dll
Run Code Online (Sandbox Code Playgroud)

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
)
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  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)
Run Code Online (Sandbox Code Playgroud)

在用pip安装'wheel'后,我可以运行python setup.py bdist_wheel生成dist\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'
Run Code Online (Sandbox Code Playgroud)

  • 这在 LD_LIBRARY_PATH 对查看和加载 .so 文件很重要的 Linux 上是否有效? (3认同)
  • 您还可以将“has_ext_modules”作为参数传递给“setup()”。它仍然期望一个可调用的。添加“has_ext_modules=lambda : True”作为“setup()”参数,您可以跳过“distclass”。 (2认同)

Tho*_*s D 8

尽管在撰写本文时所选答案是正确的,但此拉取请求打破了此功能.

我认为这个答案在新版本的轮组件中正确解决了这个问题.

(会添加此作为评论,但缺乏所需的声誉.)