准备基于 C 的 Cython 包以在 pypi 上发布

fra*_*iis 5 python cython pypi

我将创建 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
Run Code Online (Sandbox Code Playgroud)

我的__init__.py文件(导入从 pip 下载的包后,它会在此处引发错误):

from . import mylib
Run Code Online (Sandbox Code Playgroud)

我的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
      }
)
Run Code Online (Sandbox Code Playgroud)

(我mylib.bycode.cpython setup.py build_ext使用 cython之前构建mylib.pyx。根据这篇文章,它会使安装包更快,并且不需要用户具有相同的 cython 版本。)

也许值得一提 - 在构建我的包后,我得到.so了 mylib 的文件。如果我将它复制到/mylib目录,然后从父目录我可以import mylib使用mylib.mylib.say_hello(). 但是它不适用于从 pip(在其他 PC 上)安装的软件包,我也不想使用mylib.mylib.

如果我应该提供更多信息 - 让我知道。

编辑:

我在 GitHub 上的项目(我之前混淆了名称,所以这里是真正的项目):https : //github.com/franiis/statr-python

我想say_hello()statr.pyx(其他方法可能不起作用)成功运行方法。

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

dan*_*nny 2

中存在几个问题setup.py

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

尝试类似的方法:

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
      }
)
Run Code Online (Sandbox Code Playgroud)

通过以上内容,扩展名将是statr._ext. pyx 的名称应该是_ext.pyx.

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

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

from ._ext import my_cython_function
Run Code Online (Sandbox Code Playgroud)