问题
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 = 'James.Bond.007@mi6.org',
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.
回答1:
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
回答2:
If that library should also be compiled during install you can describe this as an extension module. If you just want to ship it add it as package_data
回答3:
As is mentioned in setupscript.html#installing-package-data:
setup(
...
package_data={'top_secret_wrapper': ['top_secret.so']},
)
来源:https://stackoverflow.com/questions/37316177/distribute-a-python-package-with-a-compiled-dynamic-shared-library