我编写了一个库,其主要功能是用C实现的(速度很关键),周围有一个很薄的Python层来处理ctypes
肮脏。
我要打包它,我想知道我最好怎么做。它必须与之交互的代码是一个共享库。我有一个Makefile,它构建C代码并创建.so
文件,但我不知道如何通过distutils编译它。我应该通过覆盖make
命令与subprocess
呼叫install
(如果是,install
是这个地方,或build
更合适?)
更新:我想注意,这是不是 Python扩展。也就是说,C库不包含自己与Python运行时交互的代码。 Python正在对直接C共享库进行外部函数调用。
答案 0 :(得分:2)
如果您按照有关如何create Python extensions in C的说明操作,则应该像this documentation一样登记扩展模块。
因此,您的库的setup.py
脚本应如下所示:
from distutils.core import setup, Extension
setup(
name='your_python_library',
version='1.0',
ext_modules=[Extension('your_c_extension', ['your_c_extension.c'])],
)
和distutils
知道如何编译扩展到C共享库以及放置它的位置。
当然我没有关于你的图书馆的更多信息,所以你可能想要为setup(...)
电话添加更多的参数。
答案 1 :(得分:1)
我考虑将python模块构建为普通共享库构建的子项目。因此,使用automake,autoconf或类似的东西来构建共享库,有一个带有setup.py的python_bindings目录和你的python模块。
答案 2 :(得分:1)
我有类似的需求,发现这个答案有用:Python setup.py call makefile don't include binaries。
我的发行版的src
目录中有一个ANSI C库。在src
目录中是一个Makefile,它在我的包目录(liblsd.so
)中构建一个名为lsd
的文件。我在setup.py中调用它,然后告诉setup使用package_data
参数包含库文件。
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',
],
)