Suppose I have a native shared library (.dll or .so), built independently of any Python mechanism, and a Python module using ctypes to interface to the library. Is there a way that I can build those into a .whl package? If so, how?
Assuming this is possible, I think I'd need the wheel package installed and to use python setup.py bdist_wheel
but what would my setup.py need to look like?
I'd like to do this so I can upload Wheels for various platforms into a private package index and be able to pip install the appropriate one for the platform I'm on.
Although the chosen answer was correct at the time of writing, this pull request broke this functionality.
I think this answer correctly solves this problem in newer versions of the wheel package.
(Would have added this as a comment, but lack the reputation needed.)
Edit: Updated for newer versions of wheel as suggested by Thomas D.
Here is a way. For an example, this uses libeay32.dll to expose an md5 package.
The project structure is:
The setup.py is:
A couple of things to note:
The Python ctypes code can load the DLL relative to itself (this code is in
__init.py__
):After having installed 'wheel' with pip, I can run
python setup.py bdist_wheel
to produce dist\md5-1.0-cp34-none-win32.whl. I happen to be using cpython 3.4, but if you want a universal wheel, you can add a setup.cfg like this one.Now I can create and activate a new virtual environment, pip install md5-1.0-cp34-none-win32.whl, and use my package: