Cython相对导入错误,即使进行绝对导入

时间:2016-01-27 14:59:51

标签: python-3.x cython

我在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会导致上述错误。

1 个答案:

答案 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函数,也不会找到该模块。