【问题标题】:Python package Cython modulePython 封装 Cython 模块
【发布时间】:2017-07-12 06:27:53
【问题描述】:

我的包结构如下:

+ repo/
+ setup.py
+ package/
    + module1/
        + submodule1.py
        + submodule2.pyx
    + module2/
        + submodule3.py

我想通过以下方式使用 submodule1.py 中的 submodule2.pyx:

import submodule2

但我完全不知道该怎么做。我尝试在 setup.py 中添加以下行:

from distutils.core import setup
from setuptools import setup
from Cython.Distutils import build_ext

ext_modules = cythonize(Extension(
        "zindex",
        sources=["ndmg/graph/zindex.pyx"],
        language="c",
))
for e in ext_modules:
    e.pyrex_directives = {"boundscheck": False}

setup(
    name='ndmg',
    ext_modules = ext_modules,
    packages=[
        'package',
        'package.module1',
    ....
)

但没有成功。我能找到的所有教程都有非常简单的示例,所以当包的其余部分只是普通的 python 代码时,我不确定如何在我的 python 包中包含 Cython 模块。有没有人有我可以效仿的好例子,或者有人可以告诉我我做错了什么吗?

提前致谢!

【问题讨论】:

  • 请在运行python setup.py build_ext --inplace 时提供有关操作系统、编译器、错误(如果有)/输出的信息。假设是 linux,检查你的目录树中是否有 submodule2.so。
  • 更准确地说:编译后的模块名称以 i.e. 结尾:*.cpython-36m-x86_64-linux-gnu.so
  • 你在 submodule1.py 中尝试过from . import submodule2 吗?
  • @Rich 尝试首先使用python setup.py build_ext --inplace 编译 PYX,这应该会生成一个 PYD 文件。然后你应该可以从你的第一个 .py 脚本中像from submodule2 import {functionname} 一样导入它。然后它应该导入模块并可用。

标签: python c package cython


【解决方案1】:

给 cythonize 的名称是 Cython 用来调用模块的名称,以及它必须导入的名称。

上述 setup.py 将生成一个名为 zindex 的本机扩展,并且必须以 import zindex 的形式导入 即使在 zindex 包中的 python 文件中

以下是如何执行此操作的示例:

from distutils.core import setup
from setuptools import setup
from Cython.Distutils import build_ext

ext_modules = cythonize(Extension(
        "ndmg.graph.zindex",
        sources=["ndmg/graph/zindex.pyx"],
        language="c",
))
<..>

构建和安装扩展。

然后可以在 ndmg/graph/py_index.py 下的 python 文件中进行操作。

from zindex import <..>

从 cython 模块导入。

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2012-10-23
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多