【问题标题】:Executing python script with arguments within comint-mode in emacs在emacs中使用comint-mode中的参数执行python脚本
【发布时间】:2014-03-21 14:08:50
【问题描述】:

我正在为 python 脚本编写一个 comint-mode。

脚本可以使用:

/usr/bin/python3.3 tool-name arg0

我正在使用 comint-mode,因为此调用会在运行前在提示符中询问一些信息。

如果我创建:

(defun create-app ()
  "create application by using python tool"
  (interactive)
  (progn 
    (setq default-directory "/path/to/tool")
    (setq buffer (get-buffer-create "*buffer_name*"))
    (apply 'make-comint-in-buffer "tool" buffer "/usr/bin/python3.3" nil nil)
    )
  )

一切正常,python 已启动,但如果我写:

(defun create-app ()
  "create application by using python tool"
  (interactive)
  (progn 
    (setq default-directory "/path/to/tool")
    (setq buffer (get-buffer-create "*buffer_name*"))
    (apply 'make-comint-in-buffer "tool" buffer "/usr/bin/python3.3 tool-name arg0" nil nil)
    )
  )

缓冲区告诉我它不能执行程序“/usr/bin/python3.3 tool-name arg0”

有没有人知道如何启动这个 python 进程并让脚本在启动前询问一些信息?

【问题讨论】:

    标签: python emacs elisp comint-mode


    【解决方案1】:

    make-comint-in-buffer (C-hfmake-comint-in-bufferRET) 的文档字符串声明如下

    (make-comint-in-buffer NAME BUFFER PROGRAM &optional STARTFILE &rest 开关) 在 BUFFER 中创建一个 Comint 进程 NAME,运行 PROGRAM。 如果 BUFFER 为 nil,则默认为由 `*'s 包围的 NAME。 如果 BUFFER 中有正在运行的进程,则不会重新启动。 程序应该是以下之一: - 一个字符串,表示要通过创建的可执行程序 `开始文件进程' - 一对形式的缺点(HOST . SERVICE),表示 TCP 要通过“open-network-stream”打开的连接 - nil,表示新分配的 pty。 ... 如果 PROGRAM 是一个字符串,那么任何更多的 args 都是 PROGRAM 的参数。

    所以正确使用函数的方法是把程序的only名作为字符串,将要传递给程序的参数作为附加参数传递给make-comint-in-buffer,如下

    (apply 'make-comint-in-buffer "tool" buffer "/usr/bin/python3.3" nil "tool-name" "arg0")
    

    【讨论】:

    • 谢谢,与:(apply 'make-comint-in-buffer "tool" buffer "/usr/bin/python3.3" nil (list "tool-name" "arg0"))
    【解决方案2】:

    您必须将tool-namearg0 放在字符串之外。您想以交互方式询问用户吗?你可以很容易地做到这一点,见http://ergoemacs.org/emacs/elisp_basics.html(最后)。

    解释:

    defun myFunc (firstArg)
      (interactive "sWhat is first arg ? ") ;; note the s
      ( ;; use firstArg)
    

    【讨论】: