【问题标题】:Get SystemError: Parent module '' not loaded, cannot perform relative import when trying to import numpy in a Cython Extension获取 SystemError:父模块''未加载,尝试在 Cython 扩展中导入 numpy 时无法执行相对导入
【发布时间】:2017-10-20 11:22:23
【问题描述】:

我在一个包内有一个 cython 扩展,其结构如下:

packagename
├── MANIFEST.in
├── packagename
│   ├── __init__.py
│   ├── packagename.py
│   ├── subpackage1
│   │   ├── __init__.py
│   │   ├── subpackage1.py
│   │   └── cythonExt1.pyx
│   ├── subpackage2
│   │   ├── __init__.py
│   │   ├── subpackage2.py
│   │   └── cythonExt2.pyx
│   └── VERSION
├── requirements.txt
└── setup.py

当我尝试在导入 numpy 的 cythonExt2.pyx 中添加一行时,我收到以下错误:

-------------------------------------------------------------
SystemError                 Traceback (most recent call last)
<ipython-input-5-5c4ef4d8efd3> in <module>()
      1 # Calling Functions of Interest
----> 2 import pacakge.subpackage2 as thingy
      3 import numpy as np
      4 import matplotlib.pyplot as plt

/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/pacakage-0.0.3-py3.5-linux-x86_64.egg/package/__init__.py in <module>()
     18 
     19 # the following line imports all the functions from package.py
---> 20 from .package import *
     21 import package.subpackage1
     22 import package.subpackage2

/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/package.py in <module>()
      1 from package.subpackage1 import thingy1
----> 2 from package.subpackage2 import thingy2
      3 import numpy as _np
      4 from multiprocessing import Pool as _Pool

/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/subpackage2.py in <module>()
      3 import os
----> 4 from cythonExt2 import solve as solve_cython
      5 from frange import frange
      6 
/home/user/anaconda2/envs/python3/lib/python3.5/site-packages/package-0.0.3-py3.5-linux-x86_64.egg/package/subpackage2/cythonExt2.pyx in init package.subpackge2.cythonExt2 (package/subpackage2/cythonExt2.c:6158)()
      1 cimport numpy
----> 2 import numpy
      3 cimport cython
      4 
      5 def get_z_n(n, z):

SystemError: Parent module '' not loaded, cannot perform relative import

如果我只是 cimport numpy 这可以工作并且我可以访问 numpy C API 但我无法导入我需要解决特定问题的 numpy python 函数。

为什么会这样,我该如何解决?

我想知道我的设置文件是否存在导致此功能无法正常工作的问题。我的 setup.py 文件的 cython 部分如下所示:

from setuptools import setup                                                                      
from setuptools.extension import Extension
from Cython.Build import cythonize                                                            
from Cython.Build import build_ext
extensions = [Extension(                                                                          
    name="cythonExt1",                                                                               
    sources=["package/subpackage1/cythonExt1.pyx"],                                                   
    include_dirs=[numpy.get_include()],                                                           
    ),                                                                                            
    Extension(                                                                                    
    name="cythonExt2",                                                                           
    sources=["package/subpackage2/cythonExt2.pyx"],                                           
    include_dirs=[numpy.get_include()],                                                           
    )                                                                                             
] 

setup(name='package',                                                                             
      ...  
      include_package_data=True,                                                                  
      packages=['package',                                                                        
                'package.subpackage1',                                                             
                'package.subpackage2',                                                         
      ],                                                                                          
      ext_modules = cythonize(extensions),                                                        
      install_requires=requirements,                                                              
)

【问题讨论】:

  • 看起来您的“20”行有问题。一个点可能只出现在两个真实姓名之间,而不是在开头。只需删除点并将父目录添加到 PYTHONPATH。
  • 这很奇怪,因为没有 cythonExt2.pyx 文件中的 import numpy 行,代码工作正常,我也在我编写的其他几个包中执行此操作,并且在这些包中工作正常。我会尝试更改它,看看它是否能解决我的问题。
  • 我这样做是为了导入 package.py 目录的内容,这样当我在 python 中导入包时,我可以执行 package.function。当我将目录添加到路径并导入包时,我只会得到一个没有导入函数的递归 package.package.package.package。
  • Numpy 也使用这种技术来导入它的核心实用程序github.com/numpy/numpy/blob/master/numpy/__init__.py#L159
  • 如果我在模块外部使用 import numpy as np 行对代码进行 cythonize 处理,它可以正常工作。如果我可以让 import 语句在我的模块安装中工作,它应该可以按预期工作。

标签: python numpy cython


【解决方案1】:

问题是这个 setup.py 文件和工作流程中没有正确包含 numpy。我通过将其更改为使 cython 扩展名在其自己的目录中被 cython 化,并将其自己的 setup.py 文件转换为 .c 文件,然后将该文件作为 C 扩展名添加到包的 setup.py 文件中来解决此问题。这还有一个好处是安装您的模块的人不需要 cython,因为您可以将生成的 .c 文件与包一起分发。

我在我的 github here 上创建了这个完整但简单的示例。

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2015-08-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多