Best way to package a Python library that includes a C shared library?

北城以北 提交于 2020-07-04 07:46:05

问题


I have written a library whose main functionality is implemented in C (speed is critical), with a thin Python layer around it to deal with the ctypes nastiness.

I'm coming to package it and I'm wondering how I might best go about this. The code it must interface with is a shared library. I have a Makefile which builds the C code and creates the .so file, but I don't know how I compile this via distutils. Should I just call out to make with subprocess by overriding the install command (if so, is install the place for this, or is build more appropriate?)

Update: I want to note that this is not a Python extension. That is, the C library contains no code to itself interact with the Python runtime. Python is making foreign function calls to a straight C shared library.


回答1:


Given that you followed the instructions on how to create Python extensions in C, you should just enlist the extension modules like in this documentation.
So the setup.py script of your library should look like this:

from distutils.core import setup, Extension
setup(
   name='your_python_library',
   version='1.0',
   ext_modules=[Extension('your_c_extension', ['your_c_extension.c'])],
)

and distutils knows how to compile your extension to C shared library and moreover where to put it.

Of course I have no further information about your library, so you probably want to add more arguments to setup(...) call.




回答2:


I'd consider building the python module as a subproject of a normal shared library build. So, use automake, autoconf or something like that to build the shared library, have a python_bindings directory with a setup.py and your python module.




回答3:


I had a similar need and found this answer helpful: Python setup.py call makefile don't include binaries.

I have an ANSI C library in the src directory of my distribution. In the src directory is a Makefile that builds a file called liblsd.so in my package directory (lsd). I call this in setup.py and then tell setup to include the library file using the package_data argument.

import os.path
import subprocess

from setuptools import setup

with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as f:
    readme = f.read()

subprocess.call(['make', '-C', 'src'])

setup(name='LSD',
  version='0.0.1',
  description='Python bindings for the LSD line segment detector.',
  long_description=readme,
  author='Geoff Hing',
  author_email='geoffhing@gmail.com',
  url='https://github.com/ghing/python-lsd',
  packages=['lsd'],
  package_data={'lsd': ['liblsd.so']},
  include_package_data=True,
  classifiers=[
      'Development Status :: 1 - Planning',
      'Intended Audience :: Developers',
      'License :: OSI Approved :: MIT License',
      'Operating System :: OS Independent',
      'Programming Language :: Python',
      'Programming Language :: C',
      ],
 )


来源:https://stackoverflow.com/questions/24062830/best-way-to-package-a-python-library-that-includes-a-c-shared-library

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!