【问题标题】:How can I make a Python Wheel from an existing native library?如何从现有的本机库制作 Python Wheel?
【发布时间】:2014-07-27 02:43:32
【问题描述】:

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

假设这是可能的,我想我需要安装 wheel 包并使用 python setup.py bdist_wheel,但我的 setup.py 需要是什么样的?

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

【问题讨论】:

    标签: python python-wheel


    【解决方案1】:

    编辑:根据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
    )
    

    有几点需要注意:

    1. DLL 被列为包数据,因此它将包含在轮子中。
    2. custom distclass is used 表示此轮具有扩展模块,并且由于轮是在 Windows 上构建的,因此这是一个 win32 轮。

    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.cfglike this one

    现在我可以创建并激活一个新的虚拟环境,pip install md5-1.0-cp34-none-win32.whl,然后使用我的包:

    >>> import md5
    >>> md5.digest('hello')
    '8d11aa0625ce42cfe9429d5e93b5ab0a'
    

    【讨论】:

    • 这在 Linux 上有效吗?在 Linux 上,LD_LIBRARY_PATH 对查看和加载 .so 文件很重要?
    • 您也可以将has_ext_modules 作为参数传递给setup()。它仍然需要一个可调用的。将has_ext_modules=lambda : True 添加为setup() 参数,您可以跳过distclass
    【解决方案2】:

    尽管在撰写本文时选择的答案是正确的,但 this pull request 破坏了此功能。

    我认为this answer在新版本的wheel包中正确解决了这个问题。

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

    【讨论】:

    • 感谢您的提醒——我已将答案更新为使用 has_ext_modules 而不是 is_pure
    猜你喜欢
    • 2021-10-09
    • 2015-03-12
    • 2014-07-17
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多