У меня возникают проблемы с Cython (с Python 3.5) с импортом между модулями в одном пакете.Ошибка относительного импорта Cython, даже при абсолютном импорте
Ошибка, которую я получаю, составляет SystemError: Parent module '' not loaded, cannot perform relative import
, даже если я, по-видимому, делаю абсолютный импорт.
Ниже приведена простая тестовая установка, которую я использую. Это отлично работает с использованием версии pure-Python ниже (.py
, а не .pyx
и без компиляции), но не скомпилировано через Cython. Примечание. В приведенном ниже примере я не использую какие-либо функции языка Cython, просто компиляцию.
Кажется, что-то в структуре я не совсем прав? Но я просто не могу понять, как это работает правильно.
Структура файла:
PackageMain
|
+--__init__.py (this is empty)
+--PackageMain.pyx
+--SomeModule.pyx
+--setup.py
Файл PackageMain.pyx
from PackageMain.SomeModule import SomeClass2 # get same error with relative import, ie just .SomeModule
class SomeClass1:
def __init__(self):
foo = SomeClass2()
Файл SomeModule.pyx
:
class SomeClass2:
def __init__(self):
print("Whoop!")
Файл setup.py
:
from distutils.core import setup, Extension
from Cython.Build import cythonize
extensions = [ Extension(language="c++", name="PackageMain",
sources=["PackageMain.pyx", "SomeModule.pyx"])]
setup( name = 'Some name',
ext_modules = cythonize(extensions))
Выполнение from PackageMain import PackageMain
с использованием файла .pyd
, созданного Cython, приводит к вышеуказанной ошибке.
Ах, они должны быть отдельными расширениями - спасибо. Это объясняет пару вещей: – Giswok
J.J. Хакала, вы могли бы добавить немного более подробную информацию о том, почему именно они должны быть определены как отдельные расширения, пожалуйста? (вместо того, чтобы пытаться объединить несколько исходных файлов в одно расширение, как было раньше) – Giswok
@ Giswok Я добавил несколько объяснений –