gpt4 book ai didi

python - 准备带有 Cython 扩展的包以在 PyPI 上发布

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:58 24 4
gpt4 key购买 nike

我要创建 C 库,我想使用 Cython 创建 Python 包装器。

现在我有 mylib.a编译和捆绑的文件(C 文件),我想在 Cython 中包装我的库中的方法。

我成功创建了.pyx.pxd文件,我可以使用 python setup.py build_ext 构建扩展命令。当我尝试在 PyPI 上发布它时出现了我的问题。如果我运行我的 setup.py ,创建一个轮子并发布它我可以从 PyPI 下载它 - 但我无法运行 import mylib .

我为此阅读了很多在线教程。他们中很少有人表明他们的 C 代码是在用户端编译的。我的代码库将由许多文件构建,我更愿意提供已经构建的 C 代码作为 .a文件。

我的文件结构(只有重要文件):

/ lib
- mylib.a
- *.h files (for mylib.a)
- setup.py
/ mylib
- mylib.pyx
- cmylib.pxd
- __init__.py

我的 __init__.py文件(导入从 PyPI 下载的包后会在此处抛出错误):

from . import mylib

我的 setup.py (只有重要的参数——在我看来):

setup(name='mylib'
packages=['mylib'],
ext_modules = [Extension(
name="mylib",
sources=["mylib/mylib.bycython.c"],
include_dirs = [numpy.get_include(), "lib/"],
extra_objects=["lib/mylib.a"])],
"build_ext": build_ext
}
)

可能值得一提 - 在构建我的包后我得到 mylib.bycython.c mylib.pyx 的文件.如果我将它复制到 cython目录然后从父目录我可以python setup.py build_ext并使用 .so 访问我的方法.但是它不适用于从 PyPI(在其他 PC 上)安装的包,我也不想使用 mylib .

如果我需要提供更多信息 - 让我知道。

编辑:

我在 GitHub 上的真实项目:this .

我要成功运行mylib/方法来自 import mylib (其他方法可能行不通)。

我知道代码有一些问题,但我想首先有一个工作核心来修复和更新所有内容。要构建项目,请使用 mylib.mylib.say_hello() . mylib.mylib创建一个轮子并发布它。

最佳答案

setup.py 中有几个问题。

  • 链接到库未由 setup.py 编译。这意味着它必须手动编译。
  • 链接到库是一个预编译的静态链接存档。这是不可移植的,除了用于构建它的 GCC/glibc 的确切版本之外,不能分发到任何其他地方。
  • cython 扩展代码不是由 setup.py 构建的。对 .pyx/.pxd 的更改不会反射(reflect)在包中。

尝试这样的事情:

from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize, build_ext

extensions = [Extension(
name="statr._ext",
sources=["statr/_ext.pyx", "lib/mylib.c"],
depends="lib/mylib.h",
include_dirs=[numpy.get_include(), "lib/"]
]

setup(name='statr'
packages=find_packages(),
ext_modules=cythonize(extensions),
build_ext: build_ext
}
)

有了上面的代码,扩展名将是 statr._ext。 pyx 的名称应该是 _ext.pyx

mylib.c 将通过 setup.py 构建并链接到扩展。 mylib.c 所需的任何其他编译器指令都应添加到扩展中。

包名将是 statr。您应该从 _ext 导入任何您希望从其 __init__.py 中的顶级 statrd 模块可用的内容,例如

from ._ext import my_cython_function

关于python - 准备带有 Cython 扩展的包以在 PyPI 上发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471084/

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