导入错误:'没有名为'*的模块*存在

hug*_*own 52 python python-import

当我开始金字塔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
Run Code Online (Sandbox Code Playgroud)

这可以从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
>>> 
Run Code Online (Sandbox Code Playgroud)

并从命令行导入:

% python -c "from ponder.server.views import Endpoints, route"
Run Code Online (Sandbox Code Playgroud)

精简tree输出显示了我正在使用的内容:

% tree
??? __init__.py
??? ponder
?   ??? __init__.py
?   ??? server
?   ?   ??? __init__.py
?   ?   ??? views
?   ?       ??? environment_templates.py
?   ?       ??? groups.py
?   ?       ??? __init__.py
?   ?       ??? instances.py
?   ?       ??? tasks.py
?   ?       ??? users.py
Run Code Online (Sandbox Code Playgroud)

PYTHONPATH被设置为这棵树的根:

% echo $PYTHONPATH
/home/hughdbrown/workspace/ept/ponder/lib
Run Code Online (Sandbox Code Playgroud)

我在使用python 2.7的virtualenv中运行它.我今天已经开始工作了,但是我无法弄清楚问题出在哪里.首先,对于之前出现的一些进口__init__.py似乎没问题:

from .database import get_db
from .config import parser
from .views import Endpoints, route
Run Code Online (Sandbox Code Playgroud)

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

我尝试过的事情:

  1. 重建virtualenv

  2. 设置 PYTHONPATH

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

  4. 寻找循环进口

我对如何调试此错误有进一步的建议.


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

jav*_*der 49

我设置了PYTHONPATH,'.'并为我解决了它.

export PYTHONPATH='.'
Run Code Online (Sandbox Code Playgroud)

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

PYTHONPATH='.' your_python_script
Run Code Online (Sandbox Code Playgroud)

这些命令应该在终端中运行


ant*_*ont 47

我通常的诀窍是简单地sys.path在导入问题发生的实际环境中打印.在你的情况下,似乎印刷的地方在/home/hughdbrown/.local/bin/pserve.然后在路径显示的位置检查dirs和文件.

你首先要做到这一点:

import sys
Run Code Online (Sandbox Code Playgroud)

并在python 2中使用print表达式:

print sys.path
Run Code Online (Sandbox Code Playgroud)

或者在python 3中使用print函数:

print(sys.path)
Run Code Online (Sandbox Code Playgroud)

  • 在python2中,它使用print表达式:`print sys.path`,在python3中使用print函数:`print(sys.path)`.在此之前你需要`import sys`. (11认同)
  • 好的,所以问题是在我的 virtualenv 中,该路径*不*存在。当我`tree` 我的virtualenv 时,我可以看到views 目录丢失了。而这个问题 *starts* 在 setup.py 我正在使用它命名要安装在包部分的目录,但不会遍历目录。好的,我正在努力解决这个问题。首先,我需要一个更好的 setup.py。 (2认同)
  • 你如何打印`sys.path`? (2认同)

小智 6

我遇到了同样的问题,我通过将以下代码添加到python文件的顶部来解决了这个问题:

import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
Run Code Online (Sandbox Code Playgroud)

重复次数os.path.dirname取决于文件在项目层次结构中的位置。例如,在我的情况下,项目根目录为三个级别。


joe*_*est 5

我遇到了同样的问题,我在错误行之前尝试了 pdb.set_trace() 。

\n\n

我的问题是包名称与模块名称重复,例如:

\n\n
test\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 b\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

在文件中a/__init__.py,使用from test.b import xxx将导致ImportError: No module named b.

\n


小智 5

PYTHONPATH设置不正确。使用export PYTHONPATH=$PYTHONPATH:/path/to/your/modules.