4

我的进口有什么问题?

应用文件夹结构:

我的应用程序/

  • 模型/models.py 包含SpotModel()
  • tests/tests.py 包含 TestSpotModel(unittest.TestCase)。tests.py 导入from myapp.models.models import *,就像一个魅力
  • 脚本/import.py 包含from myapp.models.models import *

问题是 import.py 在执行时会导致错误:

ImportError: No module named myapp.models.models

但是 tests.py 运行。

我在 , 和 中有文件,__init__.py如前所述,使用 nosetests 运行单元测试可以按预期工作。myapp/__init__.pymyapp/models/__init__.pymyapp/tests/__init__.py

4

4 回答 4

4

__init__.py不是init.py。确保层次结构中的每个目录都包含它以便能够导入。

编辑:我设法重现它。这是目录结构:

cesar@cesar-laptop:/tmp/asdasd$ 树
.
`-- 我的应用
    |-- __init__.py
    |-- 型号
    | |-- __init__.py
    | `--模型.py
    |-- 脚本
    | |-- 数据.py
    | `-- __init__.py
    `-- 测试
        |-- __init__.py
        `-- 测试.py

我将以下代码放在最开始data.py以缩小问题范围:

import sys
import pprint

pprint.pprint(sys.path)

from myapp.models.models import *

以 OP 指示的方式运行会data.py产生 ImportError:

cesar@cesar-laptop:/tmp/asdasd$ python myapp/scripts/data.py
['/tmp/asdasd/myapp/scripts',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- 跳过 --
'/usr/local/lib/python2.6/dist-packages']
回溯(最近一次通话最后):
  文件“myapp/scripts/data.py”,第 6 行,在
    从 myapp.models.models 导入 *
ImportError:没有名为 myapp.models.models 的模块

但这种方式就像一个魅力:

cesar@cesar-laptop:/tmp/asdasd$ python -m myapp.scripts.data
['',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- 跳过 --
'/usr/local/lib/python2.6/dist-packages']

注意第一个条目的区别sys.path

于 2010-08-21T13:59:04.327 回答
1

sys.path当您运行测试和运行脚本时,您的设置方式显然不同。做

import sys
print(sys.path)

在两个模块的顶部进行确认。然后,修复错误的那个(通过在它丢失的情况下附加到sys.path父目录。myapp

于 2010-08-21T14:53:18.863 回答
1

你执行得如何import.py?这样做时当前的工作目录是什么?

myapp目录必须位于 Python路径上(即在 中列出的目录之一内sys.path),您才能访问import它。Python 在解释器启动时自动将当前工作目录添加到路径列表中。

因此,如果包含的目录myapp未手动添加到路径中(例如,使用PYTHONPATH环境变量,或将其添加到sys.pathin sitecustomize.py),您将需要在myapp运行脚本时位于包含的目录中。如果您在myapp目录本身内,您将无法导入myapp包。

于 2010-08-21T14:04:25.733 回答
0

除非您忘记提及,否则您没有__init__.pyin myapp/scripts,因此myapp/scripts/import.py不是myapp.

除非myapp以某种方式在您的全局路径中,否则脚本找不到它,因为它不会在正确的位置寻找它。

通过向其添加 a 使您的脚本文件夹成为一个模块__init__.py,将脚本向上移动到文件系统层次结构(进入myapp或进入其父文件夹)或安装myapp到您的路径中(即,将其移动到您的packages文件夹,例如/usr/lib/python2.6/dist-packages/)。

于 2010-08-21T16:04:39.900 回答