Python导入错误
-
30-09-2019 - |
题
我的进口有什么问题?
应用文件夹结构:
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.path
在 sitecustomize.py
),您需要在包含的目录中 myapp
运行脚本时。如果你在里面 myapp
目录本身,您将无法导入 myapp
包裹。
您的 sys.path
显然,当您运行测试和运行脚本时,设置不相同。做
import sys
print(sys.path)
在两个模块的顶部以确认这一点。然后,修复一个错误的(通过附加到 sys.path
父母目录 myapp
在失踪的情况下。
除非您忘了提到它,否则您没有 __init__.py
在 myapp/scripts
, , 所以 myapp/scripts/import.py
不是一个模块 myapp
.
除非 myapp
在您的全球路径中,脚本找不到它,因为它不会在正确的位置寻找它。
要么通过添加一个使您的脚本文件夹成为模块 __init__.py
向此,将脚本移至文件系统层次结构(要么 myapp
或进入其父文件夹)或安装 myapp
进入您的道路(即将其移至您 packages
文件夹,例如 /usr/lib/python2.6/dist-packages/
).