23

我正在使用 pdb 在 emacs 中调试一些 python 代码并遇到一些导入问题。依赖项安装在我定制的 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/

这在运行 Mx python-shell 时效果很好

>>> import sys
>>> print sys.path 

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

然而,这与 M- 相矛盾!哪个python,它给出/usr/bin/python

有谁知道我如何告诉 Mx pdb 从当前活动的 virtualenv 中采用 python 进程?

4

4 回答 4

18

像这样调用 pdb:

python -m pdb myscript.py

代替

pdb myscript.py
于 2012-04-25T09:43:02.797 回答
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/to/virtual/env/bin/pdb 的第一行以具有:

#! /usr/bin/env python

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

于 2010-09-17T12:59:37.830 回答
2

您的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 中开发/调试,我还从系统文件中删除了pdbpdb2.6 。这样做,我就不会再被同样的伎俩抓住了。

我希望它有所帮助。

于 2012-06-03T00:51:44.433 回答
1

一个快速的解决方法是在你的虚拟环境中显式调用 python 解释器。

MX pdb,然后:

path/to/your/virtualenv/python3 -m pdb your_source.py
于 2019-10-24T09:02:00.253 回答