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

时间:2010-09-17 11:27:58

标签: python emacs virtualenv pdb

我正在使用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进程?

4 个答案:

答案 0 :(得分:13)

像这样调用pdb:

python -m pdb myscript.py

而不是

pdb myscript.py

答案 1 :(得分:8)

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-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