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

3
我在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生成的.pyd文件来运行from PackageMain import PackageMain会导致上述错误。

1个回答

4
以下是代码/定义,具体内容如下:

使用以下代码/定义:

>>> 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的模块的初始化函数将不会被调用,因此该模块将无法被找到。

啊,它们必须是不同的扩展名 - 谢谢。这解释了一些事情。 - Giswok
J.J. Hakala,您能否详细说明为什么需要将它们定义为单独的扩展名呢?(而不是像我之前那样尝试将几个源文件合并为一个扩展名) - Giswok
1
@Giswok 我添加了一些解释。 - J.J. Hakala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接