import error: 'No module named' *does* exist
当我启动金字塔pserver时,我正在获取此堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | % 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可以很好地工作:
1 2 3 4 5 6 | % 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 >>> |
号
从命令行导入:
1 | % python -c"from ponder.server.views import Endpoints, route" |
简略的
1 2 3 4 5 6 7 8 9 10 11 12 13 | % tree ├── __init__.py ├── ponder │ ├── __init__.py │ ├── server │ │ ├── __init__.py │ │ └── views │ │ ├── environment_templates.py │ │ ├── groups.py │ │ ├── __init__.py │ │ ├── instances.py │ │ ├── tasks.py │ │ └── users.py |
。
我的
1 2 | % echo $PYTHONPATH /home/hughdbrown/workspace/ept/ponder/lib |
我在使用python 2.7的virtualenv中运行它。我今天一直在做这个工作,但我不知道问题出在哪里。一方面,
1 2 3 | from .database import get_db from .config import parser from .views import Endpoints, route |
。
(我把最后一行改为绝对导入。没有运气。)
我尝试过的事情:
重建virtualenv
设置
在代码中使用绝对路径
正在查找循环导入
对于如何调试此错误,我愿意提供进一步的建议。
所以我犯的错误是只看源树。问题实际上是在运行时环境中,在我的virtualenv中。当我查看那里时,我发现所需的文件没有被安装。问题的根源是
我通常的技巧是在实际情况下打印
你首先要做的是:
1 | import sys |
在带有打印表达式的python 2中:
1 | print sys.path |
号
或者在具有打印功能的python 3中:
1 | print(sys.path) |
我把
1 | export PYTHONPATH='.' |
。
对于一个一行程序,您可以很容易地做到:
1 | PYTHONPATH='.' your_python_script |
这些命令应该在终端中运行
我也遇到了同样的问题,我通过在python文件的顶部添加以下代码解决了这个问题:
1 2 3 4 | import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) |
号
我遇到了同样的问题,我在错误行之前尝试pdb.set_trace()。
我的问题是包名与模块名重复,例如:
1 2 3 4 5 6 7 | test ├── __init__.py ├── a │ ├── __init__.py │ └── test.py └── b └── __init__.py |
。
在文件
它们是运行python脚本的几种方法:
- 双击file.py运行(它打开python命令行)
- 从命令提示(cmd)(拖放)运行file.py比如你的文件)
- 在IDE中运行file.py(例如pyscripter或pycharm)
每种方法都可以运行不同版本的python(·)
检查命令运行的python版本:键入命令:
1 | python --version |
。
检查单击.py时运行的python版本:
选项1:
创建一个包含以下内容的test.py:
1 2 | import sys print (sys.version) input("exit") |
。
选项2:
键入命令:
1 2 | assoc .py ftype Python.File |
检查路径,如果在命令中识别出模块(例如win32clipboard):
创建一个包含以下内容的test.py:
1 2 3 4 5 6 | python import sys sys.executable sys.path import win32clipboard win32clipboard.__file__ |
。
检查路径以及.py中是否识别模块
创建一个包含以下内容的test.py:
1 2 3 4 5 | import sys print(sys.executable) print(sys.path) import win32clipboard print(win32clipboard.__file__) |
如果cmd中的版本正常,但不在.py中,那是因为与.py关联的默认程序不正确。更改.py的python版本
要更改与cmd关联的python版本:
江户十一〔四〕号在系统变量中,将
要更改与.py扩展名关联的python版本:
以管理员身份运行命令:
写入:
其他:
"无模块错误"也可能来自语法错误btw python et 3(例如,打印函数缺少括号…)
·因此,他们每个人都有自己的PIP版本。
我也遇到过这个问题,在执行程序之前,我刚刚忘记在终端中键入workon myproject。
我打错字就知道了。我有
1 | __init.py__ |
号
而不是
1 | __init__.py |
如果在另一个目录中有一个与模块同名的脚本,它将使用该脚本。例如:
1 2 3 4 5 6 7 8 | module.py module | |--module | | | |--__init__.py | |--module.py |
这样就可以使用第一个module.py,而不是第二个module.py。
如果这是任何人感兴趣的话,我在Cygwin运行python时也遇到了同样的问题,在我的情况下,我很高兴熊猫没有安装,即使安装了。问题是我安装了两个python——一个安装在windows中,另一个安装在cygwin中(使用cygwin安装程序),虽然这两个版本都是python的相同版本,但是cygwin安装程序对熊猫的安装位置感到困惑。当我卸载cygwin的python并将cygwin指向windows安装时,一切都很好。
我也有同样的问题。我通过在不同的Python版本中运行该命令来解决这个问题。我试过了。之前我使用的是python 2.7。
另一种可能是从中导入内容的文件可能包含BOM(字节顺序标记)。它可以通过在支持多种编码的编辑器(如vscode(notepad++)中打开该文件,并以不同的编码标准(如ansi、utf-8(无BOM))保存来解决。