我的进口有什么问题?

应用文件夹结构:

myapp/

  • 模型/型号。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 文件中的文件 myapp/__init__.py, myapp/models/__init__.py, myapp/tests/__init__.py 如前所述,使用Nosetests运行单元测试按预期工作。

有帮助吗?

解决方案

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

编辑: 我设法复制了它。这是目录结构:

cesar@cesar-laptop:/tmp/asdasd$ tree
.
`-- myapp
    |-- __init__.py
    |-- models
    |   |-- __init__.py
    |   `-- models.py
    |-- scripts
    |   |-- data.py
    |   `-- __init__.py
    `-- tests
        |-- __init__.py
        `-- tests.py

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

import sys
import pprint

pprint.pprint(sys.path)

from myapp.models.models import *

运行 data.py OP表示Yeilds 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',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']
Traceback (most recent call last):
  File "myapp/scripts/data.py", line 6, in 
    from myapp.models.models import *
ImportError: No module named 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',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']

注意第一个条目的差异 sys.path.

其他提示

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

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

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

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

import sys
print(sys.path)

在两个模块的顶部以确认这一点。然后,修复一个错误的(通过附加到 sys.path 父母目录 myapp 在失踪的情况下。

除非您忘了提到它,否则您没有 __init__.pymyapp/scripts, , 所以 myapp/scripts/import.py 不是一个模块 myapp.

除非 myapp 在您的全球路径中,脚本找不到它,因为它不会在正确的位置寻找它。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top