我的模块有__init__.py,但Python无法导入它

时间:2016-10-10 08:47:41

标签: python

我有一个小的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'

test_models.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import unittest
from address_book import models
...
...
...
if __name__ == '__main__':
    unittest.main()

4 个答案:

答案 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变量,并且相同的代码将起作用