我查看了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,我可以运行我的单独测试,但我无法构建测试文件。它给了我上面的错误。
答案 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
进一步的调试建议:
放置
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模块的目录中。