同一包中的cython导入错误

时间:2018-05-24 23:47:29

标签: python cython cythonize

我已经看过this question并且答案似乎没有成功。以下是我的目录结构。

.
├── my_package
│   ├── a.pyx
│   ├── b.pyx
│   ├── b.pxd
│   ├── test.py
│   └── __init__.py
└── setup.py

a.pyx文件

cimport my_package.b  as b

class a:
    def __init__(self):
        self.b = b.b()
        self.b.run()

b.pyx文件

cdef class b:

    def __init__(self):
        pass

    cpdef run(self):
        print "b is running"

b.pxd文件

cdef class b:
    cpdef run(self)

test.py

import a

c = a.a()

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy

extensions = [
    Extension("my_package.a", ["my_package/a.pyx"]
        ),
    Extension("my_package.b", ["my_package/b.pyx"]
)
]

for e in extensions:
    e.cython_directives = {"embedsignature": True}

setup(
    name = "preprocess",
    ext_modules = cythonize(extensions),
)
运行python setup.py build_ext --inplace

没有编译错误。但是,如果我尝试运行test.py,它会给ImportError: No module named my_package.b

任何输入将不胜感激。

顺便说一下,如果我们将a.pyx的第一行从cimport my_package.b as b更改为import b,它就可以正常工作。

1 个答案:

答案 0 :(得分:1)

要使cimport子包工作,包目录需要包含__init__.pxd

相当于__init__.py的{​​{1}}而不是cimport

使目录结构如下:

import

然后将pxd文件作为包数据包含在. ├── my_package │ ├── a.pyx │ ├── b.pyx │ ├── b.pxd │ ├── test.py │ └── __init__.py │ └── __init__.pxd └── setup.py 中,以便安装它们:

setup.py

注意 - from setuptools import setup, Extension from Cython.Build import cythonize extensions = [ Extension("my_package.a", ["my_package/a.pyx"] ), Extension("my_package.b", ["my_package/b.pyx"] ) ] for e in extensions: e.cython_directives = {"embedsignature": True} package_data = {'my_package': ['*.pxd']} setup( name = "preprocess", ext_modules = cythonize(extensions), include_package_data=True, package_data=package_data, ) 不应该在setup.py中,因为它会使安装包不起作用,除非已经安装了numpy。

将其放入import numpy以便随包一起安装。