对python导入感到困惑

时间:2013-08-18 17:03:32

标签: python linux package importerror

我查看了the Python 2.7.5 documentation。我在实际项目中遇到问题,但在这里创建了一个小型测试项目,以简明扼要地重现该问题。想象一下包含以下布局的包在〜/ Development / Test

中存储

这是结构:

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,我可以运行我的单独测试,但我无法构建测试文件。它给了我上面的错误。

2 个答案:

答案 0 :(得分:1)

模块名称区分大小写。使用:

import Test.foo as foo

as foo以便您可以在foo.bar中致电main。)


您还必须在PYTHONPATH中列出~/Development

如果使用Unix而你的登录shell是bash,要将~/Development添加到PYTHONPATH编辑〜/ .profile以包含

export PYTHONPATH=$PYTHONPATH:$HOME/Development

以下是instructions for Windows


进一步的调试建议:

放置

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

位于test_foo.py的顶部。请发布输出。

答案 1 :(得分:1)

应始终将Runnable脚本放在模块外部。因此,如果您有一个模块和一个运行该模块的代码的脚本,那么结构应如下所示:

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

再次放在您放置foo模块的目录中。