gpt4 book ai didi

python - 使用 Cython 扩展模块分发共享库和一些 C 代码

转载 作者:IT老高 更新时间:2023-10-28 21:55:34 27 4
gpt4 key购买 nike

我正在尝试从大型 C++ 共享库 (libbig.so) 中获取一些函数,并通过 Cython 将它们公开给 Python。为此,我有一个小的 C++ 文件 (small.cpp),它为我需要的共享库中的功能提供了一个精简的包装器,以一种易于通过 Cython (pysmall.pyx) 调用的方式。

libbig.so -> small.cpp, small.h -> libsmall.so -> pysmall.pyx -> pysmall.cpp -> pysmall.so

我可以在我自己的计算机上构建和运行这个扩展模块:我只是将 small.cpp 编译成 libsmall.so,然后在 setup.py 的 Extension 对象中说“libraries=['small']”来构建扩展模块 pysmall.so.

我现在正在尝试分发此扩展模块,并且很难找到描述 setup.py 分发 Cython 模块以及 C 源代码和共享库的最佳实践的资源。我已通读“Installing Python Modules”、“Distributing Python Modules”和“Distributing Cython Modules”。我了解如何自行分发扩展模块。我不太确定分发扩展模块依赖项的最佳方式。

Cython 文档指出您应该包含生成的 .cpp 文件以及 .pyx 文件,以防 Cython 不存在,但它没有提供代码来演示如何最好地处理每种情况。它也没有提到如何分发 Cython 模块所依赖的共享库。

我正在研究来自 pandas、lxml、pyzmq、h5py 等的 setup.py 脚本,并且发生了很多无关的工作。如果有人有可能加速此过程的指针或示例代码,我当然会很感激!

最佳答案

1) 分发 libbig.so

这是 python 无法帮助您解决的问题。你的目标是谁?如果是 linux,你能要求他们用他们的包管理器安装它吗?如果 libbig 不是通过包管理器分发的,或者它不是 linux 并且您的目标是多个体系结构,您可能必须分发 libbig 源代码。

2) Cython/setuptools。

坦率地说,我认为只要求人们拥有 Cython 是最简单的。这样,代码只有一个真实版本,您不必担心 .pyx.cpp 代码之间的不一致。最简单的方法是使用 setuptools 而不是 distutils。这样,您可以使用:

setup('mypackage',
...
install_requires=['cython'])

总的来说,您的 setup.py 脚本将类似于:

# setup.py

from setuptools import setup, Extension
from Cython.Distutils import build_ext

pysmall = Extension('pysmall',
sources = ['pysmall.pyx', 'small.cpp'],
include_dirs = ['include/'])

setup(name='mypackage',
packages=['yourpurepythonpackage'],
install_requires=['cython==0.17'],
ext_modules=[pysmall],
cmdclass = {'build_ext': build_ext})

如果您不喜欢需要 cython 的想法,您可以执行以下操作:

# setup.py

import warnings
try:
from Cython.Distutils import build_ext
from setuptools import setup, Extension
HAVE_CYTHON = True
except ImportError as e:
HAVE_CYTHON = False
warnings.warn(e.message)
from distutils.core import setup, Extension
from distutils.command import build_ext

pysmall = Extension('pysmall',
sources = ['pysmall.pyx', 'small.cpp'],
include_dirs = ['include/'])

configuration = {'name': 'mypackage',
'packages': ['yourpurepythonpackage'],
'install_requires': ['cython==0.17'],
'ext_modules': [pysmall],
'cmdclass': {'build_ext': build_ext}}

if not HAVE_CYTHON:
pysmall.sources[0] = 'pysmall.cpp'
configuration.pop('install_requires')

setup(**configuration)

关于python - 使用 Cython 扩展模块分发共享库和一些 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com