如何从现有的本机库制作Python Wheel?

发布于 2021-01-29 15:07:07

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

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

我想这样做,因此我可以将适用于各种平台的Wheels上传到私有软件包索引中,并可以为正在使用的平台安装相应的Wheels。

关注者
0
被浏览
77
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    编辑 :根据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. 使用自定义distclass来指示此轮子具有扩展模块,并且由于该轮子是在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.cfg这样的一个

    现在,我可以创建并激活一个新的虚拟环境,点安装md5-1.0-cp34-none-win32.whl,并使用我的软件包:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看