Получение pdb в Emacs для использования процесса Python из текущего virtualenv - PullRequest
21 голосов
/ 17 сентября 2010

Я отлаживаю некоторый код на python в emacs, используя pdb, и получаю некоторые проблемы с импортом.Зависимости установлены в одной из моих специально разработанных сред virtualenv.

1002 * PDB упорно используя / USR / BIN / питон, а не процесс питон из моего virtualenv.

Я использую 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 принять процесс Python из текущего активного virtualenv?

Ответы [ 3 ]

13 голосов
/ 25 апреля 2012

Вызовите pdb так:

python -m pdb myscript.py

Вместо

pdb myscript.py
8 голосов
/ 17 сентября 2010

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 / to / virtual / env / bin / pdb, чтобы иметь:

#! /usr/bin/env python

Повторно активируйте env, и Pdb теперь должен использовать ваш python virtualenv вместо общесистемного питона.

1 голос
/ 03 июня 2012

Возможно, ваша команда 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 там нет После тщательного изучения я нашел pdb.py для python-2.7 в папке lib. Затем для удобства я создал несколько символических ссылок:

$ 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 есть. Полезно знать!

Я также удалил pdb и pdb2.6 из системных файлов, когда я предпочитаю разрабатывать / отлаживать в virtualenv. Делая это, я не поймаю снова на том же трюке.

Надеюсь, это поможет.

...