【问题标题】:Python mode in Emacs: No such file or directory, pdbEmacs 中的 Python 模式:没有这样的文件或目录,pdb
【发布时间】:2012-02-06 21:37:15
【问题描述】:

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

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

我可以在 minibuffer 的提示符中提供 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 保存的路径?

【问题讨论】:

  • 您的路径中有pdb 吗?您是否尝试过设置pdb-path 变量的值?如果在 Emacs Lisp 缓冲区中评估 (py-guess-pdb-path) 会得到什么结果?
  • 谢谢@LukeGirvin 我试过M-: (py-guess-pdb-path) 我得到了(Debugger entered-Lisp error: (void-function py-guess-pdb-path)
  • 奇怪,你运行的是最新版的python-mode吗?
  • @LukeGirvin 是的,最新稳定版:6.0.4
  • 尝试M-: exec-path RETM-: (getenv "PATH") 看看$PATH Emacs 正在使用什么。如果您使用的是 OSX,它可能与您在终端中看到的不匹配,因此您可能想尝试this trick

标签: python debugging emacs


【解决方案1】:

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

首先找出适用于您的终端的$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

更新

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

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

(我发现了一个注释 here 建议使用这种技术。)

在 Windows 下等效的是一个名为 pdb.bat 的文件,其中包含:

python -u -m pdb %1

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

【讨论】:

  • 谢谢@sanityinc。在我的 shell 上,which pdb 什么都不返回,which python 返回 /sw/python-2.7.1/bin/python。我知道我安装了pdb,因为我可以使用python -m pdb my_file.pdb 进行调试。你知道我在哪里可以找到pdb 吗?
  • 另外,当你说我应该在 Emacs 中明确设置环境变量 $PATH 时,我不确定我是否理解。 Emacs 有自己的环境变量吗? (除了那些外壳有?)。 Emacs 是否应该从 shell 继承环境变量?
  • 啊哈,对 - 所以 pdb 只是一个模块。请参阅上面的更新答案; $PATH 在 Emacs 中和你的 shell 中通常是一样的,但是我误解了你的问题,所以请忽略我的建议。
  • 我想当你说string-split时你的意思是split-string
  • @sanityinc,我认为另一种更简单的查找要使用的 pdb 的方法是使用以下命令:python -c 'import pdb; print(pdb.__file__)'
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案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" 发现了这一点。

    【讨论】:

      【解决方案4】:

      您可以像这样创建自定义命令:

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

      【讨论】:

        【解决方案5】:

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

        例如,pdb "./manage.py runserver" 将启动一个 Django 服务器。

        【讨论】:

          【解决方案6】:

          每个人都在说你必须创建一个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

          【讨论】:

            【解决方案7】:

            我的答案基于@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")))
            

            【讨论】:

              猜你喜欢
              • 2019-01-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多