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

最佳答案

问题源于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也可以是相对路径,只要相对路径指向当前工作目录中的源目录即可

为了避免每次输入env PYTHONPATH=/path/to/base_dir时都可以使用shell适当的语法对其进行设置。下面,我使用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


这使您可以更轻松地打包项目,而无需包括测试。

关于python - 我的模块具有__init__.py,但Python仍无法导入它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39954495/

10-16 20:45