我正在使用pdb在emacs中调试一些python代码并获得一些导入问题。依赖项安装在我的一个bespoked virtualenv环境中。
Pdb顽固地使用/ usr / bin / python而不是我的virtualenv中的python进程。
我使用virtualenv.el支持在emacs中切换环境,并通过
中描述的postactivate挂钩http://jesselegg.com/archives/2010/03/14/emacs-python-programmers-2-virtualenv-ipython-daemon-mode/
运行M-x python-shell时运行良好
>>> import sys
>>> print sys.path
这指向我所有的virtualenv库,表明python-shell是我的virtualenv。
然而,这与M-相矛盾!哪个python,它提供 / usr / bin / python有谁知道我怎么能告诉M-x pdb采用当前活跃的virtualenv的python进程?
答案 0 :(得分:13)
像这样调用pdb:
python -m pdb myscript.py
而不是
pdb myscript.py
答案 1 :(得分:8)
python-shell
使用变量python-default-interpreter
来确定要使用的python解释器。当此变量的值为cpython
时,会查询变量python-python-command
和python-python-command-args
以确定解释器
和使用的参数。这两个变量由virtualenv.el
操纵,以设置当前的虚拟环境。
因此,当您使用python-shell
命令时,它会毫无问题地使用您的虚拟环境。
但是,当你执行 M - ! python
时,你没有使用变量python-python-command
和python-python-command-args
。所以它使用它在你的路径中找到的python工具。
当你调用 M-x pdb
时,它使用gud-pdb-command-name作为默认的pdb工具。要重新定义此变量,每次激活环境时,都可以执行以下操作:
(defadvice virtualenv-activate (after virtual-pdb)
(custom-set-variables
'(gud-pdb-command-name
(concat virtualenv-active "/bin/pdb" ))))
(ad-activate 'virtualenv-activate)
要在虚拟环境中安装pdb,请执行以下操作:
cp /usr/bin/pdb /path/to/virtual/env/bin
然后编辑/ path /到/ virtual / env / bin / pdb的第一行:
#! /usr/bin/env python
重新激活你的env,Pdb现在应该使用你的virtualenv python而不是系统范围的python。
答案 2 :(得分:1)
可能,您的 pdb 命令与某个特定版本绑定。
$ ls -ald /usr/bin/pdb
lrwxrwxrwx 1 root root 6 Jun 2 23:02 /usr/bin/pdb -> pdb2.6
然后,查看pdb2.6的第一行。它包含
#! /usr/bin/python2.6
这就是为什么 pdb 很顽固,似乎总是在特定版本的Python下运行。因为它确实是!实际上,对于像符号调试器这样的软件来说,这种依赖性是有意义的。
我从源代码编译python2.7,而pdb显然不存在。 经过一番审查后,我在lib文件夹下找到了python-2.7的pdb.py。 为方便起见,我已经为它创建了一些符号链接:
$ cd /opt/python-dev ##-- this is where I installed from sources
$ cd bin
$ sudo ln -s ../lib/python2.7/pdb.py pdb2.7
$ sudo ln -s pdb2.7 pdb
现在观察pdb2.7的第一行。它写着:
#! /usr/bin/env python
...看起来比以前的版本好。它基本上意味着pdb将在您在环境中定义的当前Python下启动,无论它是什么,而不是任何硬编码,如 / usr / bin / python 或 / usr / bin /python2.6 是。很高兴知道!
一旦我更喜欢在virtualenv中开发/调试,我还从系统文件中删除了 pdb 和 pdb2.6 。这样做,我不会被同样的伎俩再次抓住。
我希望它有所帮助。
答案 3 :(得分:0)
一种快速的解决方法是在虚拟环境中显式调用python解释器。
M-x pdb,然后:
path/to/your/virtualenv/python3 -m pdb your_source.py