导入错误:“没有命名模块”\*确实存在

新手上路,请多包涵

当我开始金字塔 pserve 时,我得到了这个堆栈跟踪:

 % python $(which pserve) ../etc/development.ini
Traceback (most recent call last):
  File "/home/hughdbrown/.local/bin/pserve", line 9, in <module>
    load_entry_point('pyramid==1.5', 'console_scripts', 'pserve')()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 51, in main
    return command.run()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 316, in run
    global_conf=vars)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 340, in loadapp
    return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 271, in loadobj
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 320, in _loadconfig
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 454, in get_context
    section)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 476, in _context_from_use
    object_type, name=use, global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 406, in get_context
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 337, in _loadfunc
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 681, in get_context
    obj = lookup_object(self.spec)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/util.py", line 68, in lookup_object
    module = __import__(parts)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/ponder-0.0.40-py2.7.egg/ponder/server/__init__.py", line 10, in <module>
    from ponder.server.views import Endpoints, route
ImportError: No module named views

这在 python REPL 中可以正常工作:

 % python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ponder.server.views import Endpoints, route
>>>

并从命令行导入:

 % python -c "from ponder.server.views import Endpoints, route"

删节的 tree 输出显示了我正在使用的内容:

 % tree
├── __init__.py
├── ponder
│   ├── __init__.py
│   ├── server
│   │   ├── __init__.py
│   │   └── views
│   │       ├── environment_templates.py
│   │       ├── groups.py
│   │       ├── __init__.py
│   │       ├── instances.py
│   │       ├── tasks.py
│   │       └── users.py

我的 PYTHONPATH 设置为这棵树的根:

 % echo $PYTHONPATH
/home/hughdbrown/workspace/ept/ponder/lib

我在使用 python 2.7 的 virtualenv 中运行它。我今天一直在工作,但我不知道问题出在哪里。一方面, __init__.py 似乎可以接受之前的 一些 导入:

 from .database import get_db
from .config import parser
from .views import Endpoints, route

(我将最后一行更改为绝对导入。没有运气。)

我尝试过的事情:

  1. 重建虚拟环境

  2. 设置 PYTHONPATH

  3. 在代码中使用绝对路径

  4. 寻找循环进口

我愿意接受有关如何调试此错误的进一步建议。


所以我犯的错误是只查看源代码树。问题实际上出在运行时环境中,在我的 virtualenv 中。当我查看那里时,我发现没有安装所需的文件。问题的根源在于 setup.py

原文由 hughdbrown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 601
2 个回答

我通常的技巧是在发生导入问题 的实际上下文 中简单地打印 sys.path 。在您的情况下,打印的位置似乎在 /home/hughdbrown/.local/bin/pserve 。然后检查路径显示的地方的目录和文件..

你首先要做到这一点:

 import sys

在带有打印功能的python 3中:

 print(sys.path)

或在带有打印表达式的python 2中:

 print sys.path

原文由 antont 发布,翻译遵循 CC BY-SA 4.0 许可协议

我将 PYTHONPATH 设置为 '.' 并为我解决了这个问题。

 export PYTHONPATH='.'

对于单线,您可以轻松地做到:

 PYTHONPATH='.' your_python_script

这些命令预计将在终端中运行

原文由 javabeangrinder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题