我有一个小的python模块
+-- address_book
| +-- models.py
| +-- __init__.py
+-- test
| +-- test_models.py
当我运行python address_book/test/test_models.py
时,我收到此错误
Traceback (most recent call last):
File "address_book/test/test_models.py", line 5, in <module>
from address_book import models
ImportError: No module named 'address_book'
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
from address_book import models
...
...
...
if __name__ == '__main__':
unittest.main()
答案 0 :(得分:2)
您的文件结构应该是
+-- address_book
| +-- __init__.py
| +-- models.py
+-- test
| +-- test_models.py
| +-- __init__.py
要使您的代码正常工作,您还必须位于address_book上方的目录中。
答案 1 :(得分:2)
就像评论中所说,你的树看起来很奇怪。将测试放在与address_book相同的级别上。
要运行测试,您应该使用自动测试发现工具,如nose或pytest(有疑问,请参加pytest)。这些工具会自动找到他们正在测试的软件包,这样您就不必安装它们或以任何方式关心它们在PATH中的存在。
起初听起来像是一种负担,不得不学习一种新工具,但它非常简单,从长远来看,pytest真的很有帮助。
答案 2 :(得分:1)
问题源于python不知道在哪里查找address_book
。您可以通过在启动python之前设置PYTHONPATH
环境变量来解决此问题。
给出以下目录结构:
base_dir
+-- address_book
| +-- __init__.py
| +-- models.py
+-- test
| +-- test_models.py
然后这将起作用:
$ env PYTHONPATH=/path/to/base_dir python address_book/test/test_models.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
只要相对路径指向当前工作目录中的源目录, PYTHONPATH
也可以是相对路径
为避免每次都使用shell适当的语法设置env PYTHONPATH=/path/to/base_dir
。下面我使用bash语法设置PYTHONPATH环境变量。
$ cd /path/to/base_dir
$ export PYTHONPATH=. # the current directory as a relative link
$ python address_book/test/test_models.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
作为旁注,我会更改您的目录结构,因为将测试保存在与源目录相同的目录树中并不是一个好主意。通常你可能会这样做:
base_dir
+-- address_book
| +-- __init__.py
| +-- models.py
+-- test # no __init__, not a module
| +-- test_models.py
这使您可以更轻松地打包项目,而不包括测试。
答案 3 :(得分:0)
There is problem with import of module from parent directory as __main__ lies in child folder
if you do the folder structure like below your same code for import will work
+----test
+---test_models.py
+---__init__.py
+---address_book
+---__init__.py
+---models.py
或者您可以将项目路径添加到PYTHONPATH变量,并且相同的代码将起作用