我在Cython(使用Python 3.5)中遇到麻烦,在一个软件包中导入模块。
我得到的错误是SystemError: Parent module '' not loaded, cannot perform relative import
,即使我显然是在进行绝对导入。
以下是我正在使用的简单测试设置。这可以使用下面的纯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) )
使用Cython生成的from PackageMain import PackageMain
文件运行.pyd
会导致上述错误。
答案 0 :(得分:3)
使用以下代码/定义,
>>> from mytest import MainModule
>>> dir(MainModule)
['SomeClass1', 'SomeClass2', '__builtins__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__spec__', '__test__']
setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
extensions = [ Extension(language="c++",
name="mytest.MainModule", sources=["mytest.MainModule.pyx"]),
Extension(language="c++",
name="mytest.SomeModule", sources=["mytest.SomeModule.pyx"])]
setup( name = 'mytest',
ext_modules = cythonize(extensions) )
mytest.MainModule.pyx
class SomeClass1:
def __init__(self):
foo = SomeClass2()
mytest.SomeModule.pyx
class SomeClass2:
def __init__(self):
print("Whoop!")
当python加载扩展模块ABC
时,它期望找到一个名为initABC
的函数,该函数将被调用以初始化模块。如果cython生成的两个C ++文件被编译并放到同一个共享库中,则不会调用另一个基于Cython的模块的init函数,也不会找到该模块。