从命令行运行python时在init.py中使用代码

时间:2013-05-07 20:37:59

标签: python unit-testing

我正在为单元测试设置一些代码。我的目录目前看起来像这样:

project/
    src/
        __init__.py
        sources.py
    test/
        __init__.py
        sources_test.py

在__init__.py中,对于测试目录,我有以下两行:

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

在测试文件中,我有一行import src.sources

当我使用nose从项目目录运行这些测试时,一切正常。如果我尝试单独运行测试,它会给我这个错误:

ImportError: No module named src.sources

我认为这是因为当我从命令行运行测试时它没有使用__init__.py。有没有办法确保即使我尝试单独运行测试也会使用这些行?

我可以从__init__.py中取出行并将它们放入我的测试文件中,但我试图避免这样做。

要单独运行测试,我正在运行python sources_test.py

2 个答案:

答案 0 :(得分:1)

你真的试图在这里滥用包裹,这不是一个好主意。

简单的解决方案是不在tests目录中运行测试。只需打上一个级别,然后执行python tests/sources_test.py

当然,这本身并不会导入test/__init__.py。为此,您确实需要导入包。所以python -m tests.sources_test可能是一个更好的主意......当然,除非你的软件包是作为脚本运行但不能导入的,否则它将不起作用。

或者,你可以(至少在POSIX平台上)从PYTHONPATH=.. python sources_test.py内做tests。这有点hacky,但它应该工作。

或者,更好的是,结合上述内容,并从tests之外做PYTHONPATH=. python tests/sources_test.py

真正的hacky解决方法是明确import __init__。这应该基本上适用于您的简单用例,但一切都错了 - 特别是,您最终得到一个名为__init__的模块,而不是一个名为test的模块,当然您的主模块不是名为test.sources_test,实际上根本没有test个包。除非您在修改sys.path后意外重新导入任何内容,否则您可能会获得模块的重复。

答案 1 :(得分:0)

如果你写

import src.source

python解释器在src目录中查找__init__.py文件。如果存在,则可以将该目录用作包名。如果你不在你的项目目录中,这是你在src目录中的情况,那么python会查看$PYTHONPATH环境变量中的目录(至少在linux中,windows也应该有一些环境变量,可能有另一个名称),如果它可以找到一个带有__init__.py文件的目录src。 你设置了$PYTHONPATH吗?