Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Distribute a Python package with a compiled dynamic shared library

How do I package a Python module together with a precompiled .so library? Specifically, how do I write setup.py so that when I do this in Python

>>> import top_secret_wrapper 

It can easily find top_secret.so without having to set LD_LIBRARY_PATH?

In my module development environment, I have the following file structure:

. ├── top_secret_wrapper │   ├── top_secret.so │   └── __init__.py └── setup.py 

Inside __init__.py, I have something like:

import top_secret 

Here's my setup.py

from setuptools import setup, Extension  setup(     name = 'top_secret_wrapper',     version = '0.1',     description = 'A Python wrapper for a top secret algorithm',     url = None,     author = 'James Bond',     author_email = '[email protected]',     license = 'Spy Game License',     zip_safe = True, ) 

I'm sure my setup.py is lacking a setting where I specify the location of top_secret.so, though I'm not sure how to do that.

like image 504
Kit Avatar asked May 19 '16 07:05

Kit


People also ask

What are the two formats Python packages can be distributed on PyPI?

There are two Python package repositories to use. One of them for testing and experimentation which is Test PyPI (test.pypi.org) and another for real index which is PyPI (pypi.org).


1 Answers

What I ended up doing is:

setup(     name='py_my_lib',     version=version,  # specified elsewhere     packages=[''],     package_dir={'': '.'},     package_data={'': ['py_my_lib.so']}, ) 

This way I get to import the lib by its name, and don't have another level of nestedness:

import py_my_lib 

and not

from py_my_lib_wrapper import py_my_lib 
like image 106
Ibolit Avatar answered Sep 20 '22 22:09

Ibolit