【问题标题】:ImportError: Cannot import Cython moduleImportError:无法导入 Cython 模块
【发布时间】:2020-12-18 01:43:24
【问题描述】:

我在 Cython 语法中有一个名为 neuron 的类,它使用魔术 (%%cython) 与 Jupyter 内联完美配合:

cdef class neuron: pass

我正在尝试对它进行 cythonize 处理,以便我可以将它导入集群并在 conda 环境中使用 Jupyter 运行更大规模的实验。我的setup.py 文件如下所示:

from setuptools import setup, Extension
from Cython.Build import cythonize

extensions = [
Extension("Neuronal_Cascades_cython_Base1", ["Neuronal_Cascades_cython_Base1.pyx"]),
]
setup(
    name="Neuronal_Cascades_cython_Base",
    ext_modules=cythonize(extensions),
)

Cythonize 工作正常,.so.c 文件创建良好,没有任何错误。但是当我在 Jupyter notebook 中导入这两个模块时,我得到了导入错误:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-3-639e2d302e82> in <module>
      1 import matplotlib.pyplot as plt
      2 import numpy as np
----> 3 from Neuronal_Cascades_cython_Base1 import neuron
      4 import os
      5 import pickle

ImportError: cannot import name 'neuron' from 'Neuronal_Cascades_cython_Base1'     (/Users/bengieru/Neuronal_Cascades/Cython/Neuronal_Cascades_cython_Base1.cpython-37m-darwin.so)

谁能告诉我我做错了什么?我觉得它可能与 setup.py 导入依赖项有关,但我不确定如何修复它。

【问题讨论】:

  • cimport numpy` 通常会要求您在 setup.py 中设置 Numpy 标头的路径,但这应该会给出明显的错误消息并且不会生成 .so 文件。您是否尝试过将模块导入为import Neutronal_Cascades_cython_Base1 并使用dir 来检查可用的模块?
  • 当我对import Neutronal_Cascades_cython_Base1 执行dir 时,我得到了['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__test__']。不确定这到底是什么意思。你认为这是我的语法吗? @大卫W
  • 我认为Neuronal_Cascadescython_Base2 可能是相关的,因为单独导入任何一个模块都会给我同样的错误,并且由于两个模块的依赖关系不同,我认为它可能与复制有关。 @ead
  • 可能值得打印 Neutronal_Cascades_cython_Base1.__file__ 并检查它是否真的是您认为的生成的 .so 文件。
  • 是的,确实是'/Users/bengieru/Neuronal_Cascades/Cython/Neuronal_Cascades_cython_Base1.cpython-37m-darwin.so'@DavidW

标签: cython importerror cythonize


【解决方案1】:

我发现了我的错误。在尝试了一百万件事之后,我认为这与我的 setup.py 或我的源代码无关。存在三个问题:

  1. setup.py 需要在父目录中才能正常工作。
  2. 一个空的__init__.py 文件需要在子目录中。

父母

|--Neuronal_Cascades_Base1

| |--neuron.pyx

| |--初始化.py

|--setup.py

(有人可以帮我很好地格式化这棵树吗?)

  1. 当您使用 Jupiter notebook 下拉菜单中的“另存为”保存 .ipynb 文件时,neuron.pyx 会创建一个看起来很奇怪的文件,并且还有许多其他不必要的元数据。因此,删除 neuron.pyx 中的所有内容并简单地将原始 cython 源代码复制粘贴到 neuron.pyx 中即可解决问题。

【讨论】:

  • 我的代码中出现类似错误,沿 cython .pyx 添加 init.py 修复了它。感谢您分享您的答案!