Ошибка импорта 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 чтобы он был установлен вместе с пакетом.

Другие вопросы по тегам