在Emacs中的Python模式:没有这样的文件或目录,pdb

时间:2012-02-06 21:37:16

标签: python debugging emacs

我有一个我想用python-mode调试的python脚本。我在this thread中读到我可以使用M-x pdb调试我的python脚本,但是我收到以下错误:

  

搜索程序:没有这样的文件或目录,pdb

我可以在迷你缓冲区的提示符中提供python -m pdb my_source_file.py,但如果Emacs可以直接从我运行的文件M-x pdb

推断出这个命令,那就太好了

更新

正在运行:

  • 红帽企业Linux服务器版本5.1(Tikanga)
  • Emacs 23.3.1

路径之间的差异

当我运行M-: exec-path时,当我运行M-: (getenv "PATH")时,我会得到不同的路径(M-: (getenv "PATH")返回的路径更长)。

有了这个:

  • pdb位于何处?如何将其添加到Emacs路径?
  • 有没有办法让Emacs 查看环境变量PATH所持有的路径?

7 个答案:

答案 0 :(得分:9)

继我之前的评论以及您对该问题的后续更新:

首先找出适用于您的终端的$PATH值。使用which pdb查找pdb可执行文件所在的位置。

然后,在Emacs中显式设置$PATH环境变量,并将其同步到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 package

更新

好的,事实证明,pdb并未提供Emacs的python-mode命令,它希望找到一个名为“pdb”的可执行文件。解决这个问题的简单方法是在$ PATH的目录中创建一个名为“pdb”的shell包装器:

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

(我发现了一条注释here暗示了这种技术。)

Windows下的等效文件名为pdb.bat,包含:

python -u -m pdb %1

-u阻止Python缓冲其输出。)

答案 1 :(得分:6)

要运行Python调试器,M-x pdb期望找到名为pdb的可执行文件。虽然pdb可执行文件可能存在于某些Python发行版中,但它并不存在于所有Python发行版中。

要解决此问题的建议位于GNU bug report #21521: pdb default suggested command

在修复错误之前,您可以设置变量gud-pdb-command-name以定义用于启动pdb的命令。在.emacs中,添加...

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

答案 2 :(得分:3)

在shell提示符下输入

which pdb

在Emacs中,输入M-x customize。选择编程>工具> GUD。将gud-pdb-command-name的值设置为which pdb返回的路径。

如果您的Emacs版本为自定义菜单提供了不同的组织,您也可以尝试

C-h v gud-pdb-command-name

然后点击customize链接,并将路径设置为pdb

虽然上述说明有所不同,但我通过阅读"Running pdb under emacs"找到了这一点。

答案 3 :(得分:2)

您可以创建如下自定义命令:

;; 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)))

答案 4 :(得分:0)

在Emacs 23.3.1中可能更高,另一种变体是使用Emacs shell EshellM-x eshell)。在Eshell下,有一个预先存在的,基于Lisp的pdb定义。这些Lisp函数在Eshell中工作,就像普通的shell命令一样。

因此,pdb "./manage.py runserver"将启动Django服务器。

答案 5 :(得分:0)

每个人都在疯狂地说您必须制作一个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

答案 6 :(得分:0)

我的答案基于@Chad Nouis提到的内容。 a link

但是,我已将其添加到python-mode中,每次加载python-mode时,它将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")))