我已经看过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
,它就可以正常工作。
答案 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
以便随包一起安装。