python - 如何从现有的 native 库制作 Python Wheel?

标签 python python-wheel

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

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

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

最佳答案

这是一种方法。例如,这使用 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 调用中添加 options={"bdist_wheel": {"universal": True}}

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

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

关于python - 如何从现有的 native 库制作 Python Wheel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071491/

相关文章:

python - 有没有办法让 tkinter 在打开时立即执行命令?

python - 生成总和为 M 的 N 个均匀随机数

python - 如何修复 "error: error in setup.cfg: command ' bdist_wheel' 没有这样的选项 'universal' "

python - 为缺少依赖声明的包(如 scipy)构建轮子

python 正则表达式子%H :%M:%S to %M:%s or 01:%M:%s

python - django 创建后将用户重定向到帖子

python - 如何将 numpy 数组列表放入 LSTM 神经网络?

python - 如何列出 python 轮中的文件?

python - 如何将单个 wheel 文件上传到 pypi 服务器?

python - 为 python 项目构建一个轮子/鸡蛋和所有依赖项