用于单元测试的Python导入让我疯狂

时间:2014-02-09 20:55:14

标签: python python-module python-unittest

我知道还有其他问题,这些问题对我来说都不起作用。我一直在创建一个简单的python应用程序并决定组织它(而不是将app和test.py放在同一目录中。我试着像这样设置它:

C:\开发\项目\模块\测试

- 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,正如许多答案所示。

正确的方法是什么?同样,构建项目以避免此问题的标准或合理方法是什么?

3 个答案:

答案 0 :(得分:0)

以编程方式使用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

无论您从何处运行脚本和跨平台,这都将有效。

答案 1 :(得分:0)

如果您只需要访问父目录,则可以使用:

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

import module

这应该适用于Windows和Linux。

答案 2 :(得分:0)

在我的大部分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