在Emacs中获取pdb以使用当前virtualenv中的Python进程

Getting pdb in Emacs to use Python process from current virtualenv

我正在使用pdb在emacs中调试一些python代码,并遇到一些导入问题。依赖项安装在我的一个定制的virtualenv环境中。

PDB顽固地使用/usr/bin/python,而不是我的virtualenv中的python进程。

我使用virtualenv.el来支持Emacs中的环境切换,并通过中描述的后激活挂钩

http://jesselegg.com/archives/2010/03/14/emacs-python-programmers-2-virtualenv-ipython-daemon-mode/

这在运行m-x python shell时非常有效

1
2
>>> import sys
>>> print sys.path

这指向我的所有virtualenv库,表明python shell是我的virtualenv。

但这与M-相矛盾!哪一个python,它给出了/usr/bin/python

有人知道我如何告诉M-XPDB采用当前活动的virtualenv中的python进程吗?


这样调用PDB:

1
python -m pdb myscript.py

而不是

1
pdb myscript.py

python-shell使用变量python-default-interpreter来确定要使用哪个python解释器。当变量值为cpython时,参考变量python-python-commandpython-python-command-args确定解释器。和要使用的参数。这两个变量由virtualenv.el操作以设置当前虚拟环境。

因此,当您使用python-shell命令时,它使用您的虚拟环境没有任何问题。

但是,当你做m时-! python,您没有使用变量python-python-commandpython-python-command-args。所以它使用路径中找到的python工具。

当您调用m x pdb时,它使用gud pdb命令名作为默认的pdb工具。要重新定义此变量,每次激活环境时,都可以执行以下操作:

1
2
3
4
5
6
(defadvice virtualenv-activate (after virtual-pdb)
  (custom-set-variables
     '(gud-pdb-command-name
        (concat virtualenv-active"/bin/pdb" ))))

(ad-activate '
virtualenv-activate)

要在虚拟环境中使用PDB,请执行以下操作:

1
cp /usr/bin/pdb /path/to/virtual/env/bin

然后编辑/path/to/virtual/env/bin/pdb的第一行,使其具有:

1
#! /usr/bin/env python

重新激活env,pdb现在应该使用virtualenv python而不是系统范围的python。


可能,您的pdb命令绑定到特定的版本。

1
2
$ ls -ald /usr/bin/pdb
lrwxrwxrwx 1 root root 6 Jun  2 23:02 /usr/bin/pdb -> pdb2.6

然后,看PDB2.6的第一行。它包含

1
#! /usr/bin/python2.6

这就是为什么PDB是顽固的,并且似乎总是在特定版本的Python下运行。因为它真的是!事实上,这种依赖性对于像符号调试器这样的软件来说是有意义的。

我从资料中编译了python2.7,显然pdb不在那里。经过仔细检查,我在lib文件夹下找到了python-2.7的pdb.py。为了方便起见,我创建了一些指向它的符号链接:

1
2
3
4
$ 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的第一行。它写道:

1
#! /usr/bin/env python

…比以前的版本更好。它基本上意味着PDB将在您在环境中定义的当前python下启动,不管它是什么,而不是任何硬编码,如/usr/bin/python或/usr/bin/python2.6。很高兴知道!

我还从系统文件中删除了pdb和pdb2.6,曾经我更喜欢在virtualenv内部开发/调试。这样,我就不会再被同样的伎俩抓住了。

希望有帮助。