2013-08-18 107 views
1

我点评了the Python 2.7.5 documentation。我与我的真实项目存在问题,但在这里创建了一个小型测试项目来简洁地重现问题。想象一下,存放在〜/开发/测试对python进口感到困惑

这里以下布局的包结构:

Test/ 
    __init__.py 
    foo.py 
    sub/ 
     __init__.py 
     test_foo.py 

和代码(__init__.py文件empy):

foo.py

def bar(): 
    print("hello world") 

test_foo.py

import Test.foo 
# also tried from Test import foo 

def main(): 
    foo.bar() 

if __name__ == "__main__": 
    main() 

当试图从终端运行test_foo.py(即, python test_foo.py)我得到:

Traceback (most recent call last): 
    File "test_foo.py", line 1, in <module> 
    import Test.foo 
ImportError: No module named Test.foo 

我试图导入从子模块中的测试文件包(foo.py)主文件(在我真正的项目的子模块为单位测试代码)。奇怪地使用Sublime text 2编辑器和插件python test runner,我可以运行我的单独测试,但我无法构建测试文件。它给了我上面的错误。

+0

错误信息中有一个输入错误:'import foo',你的文件代码指出'import test.foo' –

+0

@kroolik,这是一个错误,应该说:Test.foo,我已经修复了它。 – Matt

+0

您不应创建并运行放置在模块中的脚本。脚本应该始终在模块之外。 –

回答

1

模块名称区分大小写。使用方法:(该as foo是这样,你可以调用mainfoo.bar

import Test.foo as foo 


您还必须~/Development在PYTHONPATH上市。

如果使用Unix和您的登录shell是bash,加~/DevelopmentPYTHONPATH编辑〜/ .profile文件包括

export PYTHONPATH=$PYTHONPATH:$HOME/Development 

这里是instructions for Windows


调试进一步建议:

广场

import sys 
print(sys.path) 
import Test 
print(Test) 
import Test.foo 

test_foo.py顶部。请张贴输出。

+0

我改变了案例(同样的问题)。还使用'as foo'子句,但没有解决问题,或者得到:'Traceback(最近调用最后一个): 文件“test_foo.py”,第1行,在中 import Test.foo as foo ImportError :没有名为Test.foo的模块 – Matt

+0

这听起来像'〜/ Development'没有在你的PYTHONPATH环境变量中列出。您必须添加该目录,以便Python知道在哪里查看以导入“Test”。 – unutbu

+0

我在linux上,并将更新后的答案添加到我的'〜/ .profile'中,但即使在重新加载bash(即'$。〜/ .profile')后,它仍然不起作用。然而,当我将test_foo.py移动到Test模块之外(进入〜/ Development)时,它现在可以工作了(如果我将它移动一级到〜/,它不会)。 – Matt

1

可运行脚本应始终放在模块外部。所以,如果你有一个模块,并运行该模块的一些代码的脚本,结构应该是这样的:

foo/ 
    __init__.py 
    bar.py 
your_script.py 

而且在your_script.py代码应该是这样的:

from foo.bar import your_func 

your_func() 

在的情况下,单元测试它一个好主意(这是刚愎自用,每个人都有自己做事的方式)来放置模块内部的测试,这样的结构应该是这样的:

foo/ 
    __init__.py 
    bar.py 
    tests/ 
     test_bar.py 

但是在这种情况下,您不应该直接运行脚本。您应该使用测试框架的一个像nose并运行:

nosetests foo 

在你放置你的foo模块的目录。

或者,如果你使用的标准unittest库中,创建一个TestSuite并没有什么,与运行:

python -m unittest foo.tests.test_bar 

又在其中放置您的富模块的目录。

+0

谢谢维克多。 ''我只是在'test_foo.py'上添加了'if __name__ =='__main __“:'部分来重现ImportError,在我的实际测试文件中,这个不存在。这是我第一个主要的python项目更好地理解如何构建目录,文件和可运行脚本是非常有用的。谢谢。 – Matt

+0

如果你使用的是鼻子,那么你创建的布局是正确的,你只需要在项目外部的'nosetests'脚本中,在你的'Test'文件夹所在的同一个目录下运行,并用'nosetests测试“,或者你想测试的任何东西,”鼻子“非常灵活。 –