【问题标题】:Cython: ImportError: No module named 'myModule': how to call a cython module containing a cimport to another cython nodule?Cython:ImportError:没有名为“myModule”的模块:如何将包含 cimport 的 cython 模块调用到另一个 cython 结节?
【发布时间】:2012-03-27 02:08:10
【问题描述】:

我正在尝试将 cython 模块 data.pyx 导入另一个 cython 模块 user.pyx。 一切都编译得很好,但是当我尝试在 python 模块中调用 user.pyx 时,我收到错误“ImportError: No module named data”。

一切都在同一个目录中。

package/
    __init__.py   #empty
    setup.py      
    data.pxd
    data.pyx
    user.pyx

我的 setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ext_modules = [
    Extension("data", ["data.pyx"]),
    Extension("user", ["user.pyx"],include_dirs = ['myPackageDir'])
    ]

setup(
  name = 'app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules  
)

运行下面的 test.py 会报错。

import user     #this line raised the 'ImportError: No module named data' below
user.doSomething()

我得到的例外是

Traceback:
 File "test.py", line 1, in <module>
    import package.user
  File "user.pyx", line 1, in init user (user.c:3384)
ImportError: No module named data

我怎样才能使导入工作?感谢您的帮助。

【问题讨论】:

  • 为什么在实际应该演示错误代码的情况下将代码编辑为工作代码?
  • @Niklas 我明白你的意思。通过我的编辑,帖子变得混乱。 Rob post 解决了错误“ImportError: no module named user”。但我的实际问题是错误'ImportError no module named data',我通过重新编译我的所有项目来解决这个问题。由于 Rob 帖子解决了一个真正的潜在问题,我将其标记为答案,即使这不是我的实际问题。对困惑感到抱歉。如果有更好的方法,请告诉我。

标签: python cython


【解决方案1】:

我在另一个项目中再次遇到这个问题。为了解决它,这是我所做的:

  • 所有importcimport 语句必须是完全限定的
  • 所有的python代码都必须包含在rootFolder
  • setup.py 必须与rootFolder 处于同一级别
  • rooFolder 中的所有文件夹,包括rootFolder 都必须包含__init__.py
  • 在您的setup.py 扩展的include_dirs 中必须包含'.'

我创建了一个简单的项目来说明这个here
这个page 帮助我创建了它。
但我的项目更简单,如果我拥有它,我认为它会对我有很大帮助。
我的项目还说明了如何自动构建项目中的所有 cython 文件。

【讨论】:

  • 有没有人碰巧有一个简单项目的 Python 3 示例?
  • 你好,为什么不上github呢?
  • "在您的 setup.py 中,扩展的 include_dirs 必须包含 '.'" 这解决了我大约 2 年的问题。非常感谢!
  • @PDiracDelta 也神奇地解决了我的一个问题。疯了吧。为什么他们不能修复它?
  • 这个答案很可悲。您根本无法将兄弟并排的 cython 包进行模块化。或者他们并不容易。
【解决方案2】:

我可能会遗漏一些关于 Cython 的信息,但我认为是:

import package.user
user.doSomething()

【讨论】:

  • 我的错误,在我的代码中,我按照您的建议编写了“package.user”。但是我在写我的问题时忘记输入它。我已经更正了我的问题。
  • 我重建了项目中的每个文件,它已经解决了问题。感谢您的帮助。
  • 不客气,但听起来您自己解决了问题。很高兴它正在工作!
猜你喜欢
  • 2018-02-05
  • 2020-04-07
  • 2012-01-13
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多