2010-09-17 1 views
20

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

Pdb упрямо использует/usr/bin/python, а не процесс python из моего virtualenv.

Я использую virtualenv.el для поддержки переключения сред внутри Emacs и через postactivate крюков, описанных в

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

Это хорошо работает, когда работает Mx питон-оболочка

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

Это указывает для всех моих виртуальных библиотек, указывающих, что оболочка python - это моя виртуальная.

Это противоречит, однако, М-! который python, который дает /usr/bin/python

Кто-нибудь знает, как я могу сказать M-x pdb, чтобы принять процесс python из текущего активного virtualenv?

+1

Ваше сообщение относится к [мой старый пакет virtualenv] (https://github.com/aculich/virtualenv.el), который я больше не поддерживаю; существует, по крайней мере, 3 новых, активно поддерживаемых пакета: [virtualenvwrapper] (https://github.com/porterjamesj/virtualenvwrapper.el), [pyvenv] (https://github.com/jorgenschaefer/pyvenv), [python- environment] (https://github.com/tkf/emacs-python-environment) – aculich

+0

Полезное обновление - спасибо @aculich – codeasone

ответ

8

python-shell использует переменную python-default-interpreter, чтобы определить, какой интерпретатор python использовать. Если значение этой переменной равно cpython, то для определения интерпретатора используются аргументыи python-python-command-args и аргументы. Эти две переменные управляются virtualenv.el, чтобы установить текущую виртуальную среду.

Поэтому, когда вы используете команду python-shell, она без проблем использует ваши виртуальные среды.

но, если сделаете M-!python, вы не используете переменные python-python-command и python-python-command-args. Поэтому он использует инструменты python, которые он находит на вашем пути.

Когда вы вызываете M-xpdb, он использует 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 

Затем измените первую строку из/путь/к/виртуальным/окр/bin/PDB иметь:

#! /usr/bin/env python 

Реактивируйте свой окр и теперь PDB должны использовать virtualenv питона вместо общесистемного питона.

+0

Спасибо, Джером. Для других, пытающихся получить эту рабочую заметку, я должен был использовать cp/usr/bin/pdb для /bin и изменить shebang, чтобы использовать исполняемый файл virtualenv python. Это связано с тем, что mkvirtualenv --no-site-packages не вносит необходимые pdb в каталог/bin созданной среды. – codeasone

+0

Thx для этих деталей. Вы также можете создать символическую ссылку, чтобы избежать копирования файлов. –

10

Invoke PDB, как это:

python -m pdb myscript.py 

Вместо

pdb myscript.py 
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, по-видимому, нет. После некоторого изучения я нашел 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. Сделав это, я не поймаю снова тот же трюк.

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

Смежные вопросы