我正在调试一个 python 脚本。我有一个部分抛出 IndexErrors,我想使用 pdb 找出原因。这是我的脚本:
try:
# do stuff that throws an IndexError
except IndexError:
import pdb; pdb.set_trace()
当我运行脚本时,它在行上崩溃import pdb; pdb.set_trace()
。我得到的回溯:
Traceback (most recent call last):
File "myfile.py", line 113, in <module>
import pdb; pdb.set_trace()
File "/usr/lib/python2.7/pdb.py", line 10, in <module>
import bdb
File "/usr/lib/python2.7/bdb.py", line 3, in <module>
import fnmatch
ImportError: No module named fnmatch
import pdb
, import bdb
, 并且import fnamatch
在 python 解释器中都可以正常工作。我什至不知道从哪里开始。
2016 年 6 月 8 日更新:这个问题最近再次引起了我的注意。恐怕我根本不记得这个,决议是什么,甚至我正在做什么。我不知道为什么我忽略了回复(好问题!)评论。在这一点上,我认为它已经解决了 - 我在过去 4 年中成功使用了 pdb :D
我现在可以说的是:我很可能使用的是 Ubuntu(可能是 12.04)。
我可能一直在使用 virtualenv。或者至少认为我使用的是 virtualenv。我希望堆栈跟踪引用类似的东西/home/foo/.virtualenvs/bar/...
,而不是/usr/lib/python2.7
。
这可能是一个范围,但我记得 pip 在默认情况下并不总是使用--no-site-packages
。也许系统 python 上安装的某些东西与我的 virtualenv 中的某些东西冲突。某处的绝对路径,或以某种方式与 PYTHONPATH 混淆?
这开始成为一个范围,但我无法想象我自己陷入了什么样的场景。这至少在我看来是合理的:
- 我在系统 python 中安装了包 X。
- 我创建了一个没有--no-site-packages 的 virtualenv,从而将 X 拉入了 virtualenv。
- 我在 virtualenv 中安装了 Y,它与 X 冲突。
- 我在终端 A 的 virtualenv 中运行我的脚本,但遇到了错误。
- 我打开终端 B,忘记激活 virtualenv,因此最终使用了不同的解释器(此解释器归功于 @DSM)。
- 没有 virtualenv(和假设的冲突),
import pdb
工作正常。
很抱歉,这个问题似乎引起了持续的兴趣,我只有预感和猜测。如果您今天遇到这种情况,我的建议是检查堆栈跟踪位置是否符合您的预期。如果是这种情况,请检查那里引用的任何文件是否确实存在,并且看起来完好无损。
除此之外,我会尝试一个新的 virtualenv。
如果您遇到此问题并找到解决方法,请发布!我很乐意接受你的回答。