Режим Python в Emacs: нет такого файла или каталога, pdb

У меня есть сценарий Python, который я хочу отладить в режиме Python. Я прочитал в этой теме, что я могу отлаживать свой скрипт на Python M-x pdbОднако я получаю следующую ошибку:

Поиск программы: нет такого файла или каталога, pdb

Я могу предоставить python -m pdb my_source_file.py в приглашении в минибуфере, но было бы неплохо, если бы Emacs мог вывести эту команду прямо из файла, на котором я запускаю M-x pdb

Обновить:

Работает на:

  • Red Hat Enterprise Linux Server, выпуск 5.1 (Tikanga)
  • Emacs 23.3.1

Различия между путями

Я получаю разные пути, когда я бегу M-: exec-path и когда я бегу M-: (getenv "PATH") (тот, который вернулся M-: (getenv "PATH") длиннее).

С этим:

  • Где pdb расположен? Как я могу добавить его в путь Emacs?
  • Есть ли способ попросить Emacs также изучить пути, содержащиеся в переменной окружения PATH?

5 ответов

Решение

В дополнение к моему комментарию ранее и вашему последующему обновлению вопроса:

Сначала выясните значение для $PATH это работает в вашем терминале. использование which pdb найти где pdb исполняемый файл находится.

Затем установите $PATH переменная среды явно в Emacs, и синхронизировать ее с exec-path следующее:

(setenv "PATH" "/usr/local/bin:/usr/bin:/bin:/some/other/dir")
(setq exec-path (split-string (getenv "PATH") path-separator))

Возможно, вам также потребуется явно установить PYTHONPATH или аналогичные переменные среды; Вы можете сделать это, используя такие строки, как строка "setenv" выше, или просто использовать пакет exec-path-from-shell elisp.

Обновить

Хорошо, так получается Emacs pdb команда не предоставляется python-mode и он ожидает найти исполняемый файл с именем "pdb". Самый простой способ исправить это - создать оболочку оболочки с именем "pdb" в каталоге на вашем $ PATH:

#!/bin/sh
exec python -m pdb "$@"

(Я нашел здесь примечание, предлагающее эту технику.)

Эквивалентом в Windows будет файл с именем pdb.bat, содержащий:

python -u -m pdb %1

(The -u не позволяет Python буферизовать свой вывод.)

Чтобы запустить Python Debugger, M-x pdb ожидает найти исполняемый файл с именем pdb, В то время как pdb Исполняемый файл может существовать в некоторых дистрибутивах Python, он не существует во всех них.

Предложение исправить это содержится в отчете об ошибке GNU #21521: предложенная команда pdb по умолчанию.

Пока ошибка не исправлена, вы можете установить переменную gud-pdb-command-name определить команду, используемую для запуска pdb. В.emacs добавь...

(setq gud-pdb-command-name "python -m pdb")

В командной строке введите

which pdb

В Emacs введите M-x customize, Выберите "Программирование"> "Инструменты"> "Gud". Установите значение gud-pdb-command-name на путь, возвращенный which pdb,

Если ваша версия Emacs представляет другую организацию для меню настройки, вы также можете попробовать

C-h v gud-pdb-command-name

Затем нажмите на customize ссылку и установите путь к pdb там.

Хотя инструкции выше отличаются, я узнал об этом, прочитав "Запуск pdb под emacs".

Вы можете создать собственную команду, например:

;; PDB command line
(defun user-python-debug-buffer ()
  "Run python debugger on current buffer."
  (interactive)
  (setq command (format "python -u -m pdb %s " (file-name-nondirectory buffer-file-name)))
  (let ((command-with-args (read-string "Debug command: " command nil nil nil)))
    (pdb command-with-args)))

В Emacs 23.3.1 и, вероятно, выше, еще одним вариантом является использование оболочки Emacs, Eshell (M-x eshell). В Eshell существует уже существующее определение pdb на основе Lisp. Эти функции Lisp работают в Eshell, как обычные команды оболочки.

Так pdb "./manage.py runserver" запустит сервер Django, например.

Мой ответ основан на том, что упомянул @Chad Nouis. ссылка

Однако я добавил это в режим python, каждый раз при загрузке режима python он будет устанавливать gud-pdb-command-name к "python -m pdb"

;; Set the PDB command
(add-hook 'python-mode-hook
       (lambda () (setq gud-pdb-command-name "python -m pdb")))

Все сходят с ума, говоря, что ты должен сделать pdb файл и сделайте его исполняемым, а затем введите ./pdb your_code.py. Это проще.

Будьте там, где вы хотите запустить отладчик. Вероятно, в вашем файле python, возможно, используйтеM-x cd куда-то добраться.

Затем введите: M-x pdb

Вам будет предложено:

Run pdb (like this):

Вы хотите, чтобы это выглядело так:

Run pdb (like this): python -m pdb your_code.py

Иногда, если я хочу запустить свой код как модуль.

Run pdb (like this): python -m pdb -m some_package.my_code

Затем введите helpи прочтите это https://docs.python.org/3/library/pdb.html

Другие вопросы по тегам