Подтвердить что ты не робот

Как я могу сделать Python Wheel из существующей библиотеки?

Предположим, что у меня есть собственная общая библиотека (.dll или .so), построенная независимо от любого механизма Python, и модуль Python с использованием ctypes для взаимодействия с библиотекой. Есть ли способ, который я могу создать в пакет .whl? Если да, то как?

Предполагая, что это возможно, я думаю, что мне понадобится установленный пакет колес и использовать python setup.py bdist_wheel, но что бы мой setup.py должен был выглядеть?

Я хотел бы сделать это, чтобы я мог загружать Wheels для различных платформ в индекс частного пакета и иметь возможность устанавливать соответствующую для платформы, на которой я нахожусь.

4b9b3361

Ответ 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
)

Несколько замечаний:

  • DLL отображается в виде данных пакета, так что она будет включена в колесо.
  • A используется пользовательский distclass, который указывает, что это колесо имеет модуль расширения, и поскольку колесо строится на Windows, это колесо win32.

Код ctypes Python может загружать DLL относительно себя (этот код находится в __init.py__):

lib_path = os.path.join(os.path.dirname(__file__), 'libeay32.dll')
lib = CDLL(lib_path)

После установки "колеса" с пипсом я могу запустить python setup.py bdist_wheel для создания dist\md5-1.0-cp34-none-win32.whl. Я использую cpython 3.4, но если вы хотите универсальное колесо, вы можете добавить setup.cfg как этот.

Теперь я могу создать и активировать новую виртуальную среду, установить install md5-1.0-cp34-none-win32.whl и использовать мой пакет:

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

Ответ 2

Хотя выбранный ответ был правильным на момент написания, этот запрос на перенос нарушил эту функциональность.

Я думаю, этот ответ правильно решает эту проблему в более новых версиях колесного пакета.

(Добавил бы это как комментарий, но не нуждался в репутации.)