ошибка импорта Cython в том же пакете - PullRequest
0 голосов
/ 25 мая 2018

Я видел этот вопрос , и, похоже, ответ не работает.Ниже приведена моя структура каталогов.

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

a.pyx file

cimport my_package.b  as b

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

b.pyx file

cdef class b:

    def __init__(self):
        pass

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

b.pxd file

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 голосов
/ 25 мая 2018

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

...