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 |
因此,当您使用
但是,当你做m时-!
当您调用m x
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内部开发/调试。这样,我就不会再被同样的伎俩抓住了。
希望有帮助。