【问题标题】:problems with python nosetestspython鼻子测试的问题
【发布时间】:2015-09-09 19:26:01
【问题描述】:

我在使用 python 鼻子测试时遇到问题。 当我尝试运行该命令时,出现导入错误。 我检查了模块是否正确安装在我的机器上。 事实上,如果我从运行nosetests的目录运行解释器, 我能够导入模块。 我检查了问题不仅在于导入该模块,还在于导入不同的模块。 哪里可以解决?

这是我运行鼻子测试后可能的回溯:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/nose/loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "/Library/Python/2.7/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/Library/Python/2.7/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/Users/user-me/Desktop/bla/tests/blatest1", line 1, in <module>
    import a_module as mo
ImportError: No module named a_module

但如果我打开 python 解释器,我可以导入 a_module。

这是我的目录结构:

ROOT
└── package
    ├── __init__.py
    ├── package1
    └── tests
        ├── tests1
        │   └── package1 -> ../../package1
        └── tests2

【问题讨论】:

  • 请发回溯
  • 你的目录结构是什么样的,你从哪个目录运行鼻子?
  • package/ 包含 init.py、modules/、tests/,我从主包目录运行。
  • 什么是“主包目录”?您的堆栈跟踪包含路径。你能告诉我们你是从哪个地方流鼻涕的吗?
  • @deets:没关系,无论我在哪里运行鼻子测试,我都会收到导入错误。我评论中的主包目录是“package/”,在上一条评论中我称之为“bla”。

标签: python nosetests


【解决方案1】:

您的问题与鼻子本身无关。在查找模块和包时,nose 不会对 Python 解释器执行任何附加操作。

如果我们假设这样的目录结构

 ROOT
 `-- package
     |-- __init__.py
     `-- tests
         `-- __init__.py

并尝试做python -c import package - 什么时候有效,什么时候失败?

这很简单。除了从ROOT 中调用命令外,它在任何地方都会失败。没有其他地方知道package

原因是 Python 保留了一个路径列表 (sys.path),它标记了包和模块的根。将采用声明import package,并遍历sys.path 中的所有条目,将搜索package.py、带有__init__.pypackage-dir 或其他一些情况(C 扩展, 新样式命名空间包)

那么ROOT 在哪里进入路径列表?很简单:Python 解释器总是将当前工作目录添加到路径列表中。

总结一下:只需在ROOT 内调用nose。

还有其他方法可以将路径添加到sys.path,例如通过使用 virtualenvs。然后你可以从任何地方导入package,只要你使用venv解释器。

【讨论】:

  • 对不起,我不是那么专家,我可能会混淆,但如果我从我的桌面执行命令 python -c "import a_module",它可以工作,而如果我运行nosetests(它导入 a_module以及)从相同的位置,它不起作用。按照您的建议,我尝试以如下方式从根目录 / 运行鼻子测试:nosetests /.../package/,但我仍然遇到 a_module 的导入问题。
  • 如果你在正确的位置,你应该像nosetests package/tests一样运行它——不要在..s的目录结构中四处走动——这表明你在包。
  • 对不起,现在我明白了,你所说的根目录是指我的包的上一级目录。我试过你说的,但同样的问题......
  • 我的具体结构如下: - ROOT -- package |-- __init__.py -- tests -- tests1 -- tests2
  • 我可以从 /tests 运行,但我遇到了同样的问题。另外我想说的是,我正在导入的模块“a_module”不在包内,但已正确安装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多