Ошибка импорта Cython в том же пакете
Я видел этот вопрос, и ответ, кажется, не работает. Ниже приведена моя структура каталогов.
.
├── my_package
│ ├── a.pyx
│ ├── b.pyx
│ ├── b.pxd
│ ├── test.py
│ └── __init__.py
└── setup.py
файл.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 ответ
За cimport
подпакета для работы, каталог пакета должен содержать __init__.pxd
,
Это эквивалент __init__.py
за cimport
вместо import
,
Сделайте структуру каталогов такой:
.
├── my_package
│ ├── a.pyx
│ ├── b.pyx
│ ├── b.pxd
│ ├── test.py
│ └── __init__.py
│ └── __init__.pxd
└── setup.py
Затем включите файлы pxd в качестве данных пакета в 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,
)
Заметка - import numpy
не должно быть в файле setup.py, поскольку установочный пакет не будет работать, если numpy уже не установлен.
Поместите это в requirements.txt
чтобы он был установлен вместе с пакетом.