【问题标题】:Python Import for unittests driving me nuts用于单元测试的 Python 导入让我抓狂
【发布时间】:2014-02-09 20:55:14
【问题描述】:

我知道还有其他类似的问题,但没有一个对我有用。我一直在创建一个简单的 python 应用程序并决定对其进行组织(而不是将应用程序和 test.py 放在同一目录中。我尝试像这样设置它:

C:\Dev\project\module\test

- project
    - __init__.py
    - module
        - __init__.py
        - module.py
        - test
             - __init__.py 
             - test_module.py

现在我已经尝试了所有我能想到的将 module.py 导入 test_module.py

import module
import project.module
import module.module
import project.module.module
from project import module
from project.module import module

这些都不起作用。它失败了:

ImportError: No module named 'whatever i put in above'

这让我发疯了,这不应该很简单吗?我错过了什么?我添加了一个测试,使用 import sys print sys.path 显示我的 PYTHONPATH。列表中的第一项是 C:\Dev\project\module\test

编辑:

我也尝试将 init 添加到顶层,但没有帮助。我知道我可以按照许多答案的建议强制编辑 sys.path。

正确的方法是什么?例如,构建项目以避免此问题的标准或明智的方法是什么?

【问题讨论】:

  • 您能在project 中添加__init__.py 吗?这意味着 Python 会将该目录作为 Python 模块读取。
  • 您是否尝试将包含单元测试的路径添加到 PYTHONPATH?
  • 这里有一些关于项目结构的好建议:blog.habnab.it/blog/2013/07/21/python-packages-and-you
  • 我还建议使用virtualenvsetuptools,这样您就可以在运行python setup.py develop 后立即安装、使用和开发您的包
  • __int__.py 都重命名为__init__.py

标签: python python-module python-unittest


【解决方案1】:

如果只需要到达父目录,可以使用:

import sys
sys.path.insert(0, '..')

import module

这应该适用于 Windows 和 Linux。

【讨论】:

    【解决方案2】:

    以编程方式处理 python 路径通常被认为不是很好的风格,但它有它的用途。我发现这是一种很好、快速的方法来做你正在做的事情(在模块下面/内部编写测试)。当然,简单的方法是简单地将您的测试放在模块之外。但是,除非这样做,否则请执行以下操作:

    import sys
    sys.path.insert(0, r'C:\Dev\project') # Add the directory containing your module.
    import module
    

    这样,您可以确保路径上的第一个目录是包含您要导入的模块的目录。您还可以通过使用与测试脚本相关的路径来避免对模块路径进行硬编码(例如,如果您希望能够将项目移动到其他地方):

    import os
    import sys
    sys.path.insert(0, os.path.abspath(os.path.join(__file__, '..', '..', '..')))
    import module
    

    无论您从哪里运行脚本,这都可以跨平台运行。

    【讨论】:

      【解决方案3】:

      在我的大多数 python 脚本开始时,我总是写以下内容:

      # Path hack.
      # http://stackoverflow.com/questions/6323860/sibling-package-imports
      import os, sys
      sys.path.insert(0, os.path.abspath('.'))
      

      我认为包装在 python 中有点搞砸了,但这是我让它工作的标准方式:)

      在执行我的脚本时,我总是使用根目录作为工作目录:

      cd C:\Dev\project
      python3 .\module\test\test_module.py
      

      在导入子模块时,我也总是从根目录开始:

      import module.module
      

      from module.module import some_identifier
      

      【讨论】:

        猜你喜欢
        • 2011-12-25
        • 2010-11-19
        • 1970-01-01
        • 2010-12-29
        • 2011-01-16
        • 2011-05-09
        • 2014-05-19
        • 2010-12-03
        • 1970-01-01
        相关资源
        最近更新 更多