当前位置: 首页 > 面试题库 >

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

齐才艺
2023-03-14
问题内容

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

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

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


问题答案:

编辑 :根据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. 使用自html" target="_blank">定义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'


 类似资料:
  • 问题内容: 我有Tapjoy来源资源,其结构如下: 必须使用Android API Level 9和更高版本进行编译。我的项目的版本为Android API Level 8。 因此,我需要从文件源中提取文件并将其包含到我的主项目中。 如何使用命令行或Eclipse正确制作文件? 问题答案: 或从命令行

  • 问题内容: 描述为: “共享秘密”的存储库,这是一种在不使用反射的情况下在另一个程序包中调用实现私有方法的机制。package- private类实现了一个公共接口,并提供了在该包内调用package- private方法的能力。实现该接口的对象是通过限制访问的第三包提供的。该框架避免了为此目的使用反射的主要缺点,即损失了编译时检查。 有人可以提供一个示例来说明此机制如何使一个包中的类访问另一个包

  • 我有一个不寻常的问题--我的Android应用程序包含原生库,而我为armeabi-v7a和x86构建原生库。然而,现在我需要将一个第三方库集成到我的应用程序中,该应用程序还包含本机库(第三方库是我通过Maven从我的build.gradle中包含的Crashlytics)。问题是第三方库的AAR提供了所有ARHiteTecure(armeabi、arm64-v8a、armeabi-v7a、mip

  • 我正在使用sping-kafka 2.2.7-RELEASE并编写生产者。我正在阅读从这里留档如下所述。 “从2.5版开始,每个版本都扩展了KafkaResourceFactory。这允许在运行时通过向它们的配置添加一个供应商来更改引导服务器:setBootstrapServersSupply ier(() → … ). 这将被调用以获取所有新连接的服务器列表。消费者和生产者通常是长期存在的。要关

  • 问题内容: 我想在python请求库中添加重试机制,因此正在使用它的脚本将重试非致命错误。 目前,我确实认为三种错误是可以恢复的: HTTP返回码502、503、504 找不到主机(现在不太重要) 请求超时 在第一阶段,我想每分钟重试指定的5xx请求。 我希望能够透明地添加此功能,而不必为从这些使用python-requests的脚本或库中进行的每个HTTP调用手动实现恢复。 问题答案: 通过扩展

  • 所以我以前遇到过这个问题,很自然地我在这里寻求帮助。Luksprog的回答很棒,因为我不知道ListView和GridView是如何通过回收视图来优化自己的。所以在他的建议下,我能够改变我向GridView添加视图的方式。问题是现在我有了一些没有意义的东西。这是我的来自我的: 问题是当我滚动时,这会发生,而不是在位置0上。。。看起来像是第6位和第8位,加上第8位有两个。现在我仍在尝试使用ListV