org library how python python-wheel

library - ¿Cómo puedo hacer una Rueda de Python desde una biblioteca nativa existente?



pypi python org pip (2)

Aunque la respuesta elegida era correcta en el momento de la escritura, esta solicitud de extracción rompió esta funcionalidad.

Creo que esta respuesta resuelve correctamente este problema en versiones más nuevas del paquete de ruedas.

(Habría agregado esto como un comentario, pero carece de la reputación necesaria).

Supongamos que tengo una biblioteca compartida nativa (.dll o .so), construida independientemente de cualquier mecanismo de Python, y un módulo de Python que usa ctypes para interactuar con la biblioteca. ¿Hay alguna manera de que pueda construirlos en un paquete .whl? ¿Si es así, cómo?

Suponiendo que esto sea posible, creo que necesitaría tener instalado el paquete de la rueda y usar python setup.py bdist_wheel pero, ¿cómo debería ser mi setup.py?

Me gustaría hacer esto para poder cargar Wheels para varias plataformas en un índice de paquete privado y poder instalar la adecuada para la plataforma en la que estoy.


Edición : Actualizado para las versiones más nuevas de la rueda como lo sugiere Thomas D.

Aquí hay un camino. Por ejemplo, esto usa libeay32.dll para exponer un paquete md5.

La estructura del proyecto es:

MD5 │ setup.py │ └───md5 __init__.py libeay32.dll

El setup.py es:

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 )

Un par de cosas a anotar:

  1. El archivo DLL aparece como paquete de datos para que se incluya en la rueda.
  2. Se utiliza un distclass personalizado que indica que esta rueda tiene un módulo de extensión, y como la rueda se está construyendo en Windows, se trata de una rueda win32.

El código ctypes de Python puede cargar la DLL relativa a sí mismo (este código está en __init.py__ ):

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

Después de haber instalado ''wheel'' con pip, puedo ejecutar python setup.py bdist_wheel para producir dist / md5-1.0-cp34-none-win32.whl. Resulta que estoy usando cpython 3.4, pero si quieres una rueda universal, puedes agregar un setup.cfg como este .

Ahora puedo crear y activar un nuevo entorno virtual, instalar pip md5-1.0-cp34-none-win32.whl, y usar mi paquete:

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