Emacs中的Python子流程无法获取输入或发送回结果

时间:2017-08-13 09:16:05

标签: python asynchronous emacs subprocess

背景

我正在编写一个小包来将Emacs Lisp计算变为Python子流程,因此我不必重现复杂的数值例程。对于我的特殊问题,我需要Python作为子流程,因为我需要维护Python完成的某些耗时的计算。对于小事情,我可以通过shell命令向Python发送计算来完美地完成任务。但是,我需要更加密集的子流程。

SETUP

  1. Windows 10下的GNU Emacs 25.2.1

  2. Anaconda用于Windows 10的Python 3.5发行版

  3. SAMPLE RUN

    从任何缓冲区,点击M-x ielm。这将打开IELM Emacs Lisp shell。以下是几分钟前我会议的成绩单:

    *** Welcome to IELM ***  Type (describe-mode) for help.
    ELISP> (setq PyProc (start-process "python" "*python*" "python"))
    #<process python>
    ELISP> (process-list)
    (#<process python> #<process ielm>)
    
    ELISP> (process-status PyProc)
    run
    ELISP> (process-type PyProc)
    real
    ELISP> (process-send-string PyProc "1+1")
    nil
    ELISP> (process-send-eof PyProc)
    #<process python>
    

    当您在IELM中运行上述Emacs Lisp(或任何您想要的方式)时,您可以观看 python 缓冲区。什么都没有显示。但是,正如您清楚地看到的,我可以终止进程并查询其运行状态。

    问题

    为什么Python进程无法在 python 缓冲区中显示任何内容?我用MySQL做了这个到远程服务器(使用本地安装的MySQL)没有问题。

2 个答案:

答案 0 :(得分:0)

我做了一些调查。我有一个部分的解决方法。但是,我仍然不知道为什么使用start-process的原始尝试不起作用。

我知道可以使用

M-x run-python

启动劣质Python进程。然后可以使用

(process-send-string PyProc "1+1\n")

其中 PyProc 是包含过程对象的符号。这将命令发送到下级进程并按下返回。奇怪的是&#34; 1 + 1 \ n&#34;不会显示在 Python 缓冲区中。返回的值会显示。在输出之前和之后存储点,然后很容易检索Python的输出。这是一个部分片段:

;; Run inferior Python process (assumes you have Python properly installed)
(setq PyProc (run-python))
;; Send a carriage return. There is some issue when the process first starts
(process-send-string PyProc "\n")
;; Store the point prior to sending a command
(setq PyPM (with-current-buffer "*Python*"
     (point)
     )
  )
;; Send a command to Python
(process-send-string PyProc "1+1;\n")
;; Get the result of the computation
(setq Result (with-current-buffer "*Python*"
               (buffer-substring-no-properties PyPM
                                       (- (point) 5)
               ) 
       )
  )

评估结果为您提供

Result -> "2"

您可以使用

终止该过程
(process-send-eof PyProc)

仍然不知道为什么我不能简单地使用启动过程。

答案 1 :(得分:0)

在我上面的第一个答案中,我使用了

(setq PyProc (run-python))

将Python作为一个劣质流程运行,因为我无法使用函数start-process启动Python。根据GNU Emacs文档,DOS程序可能存在许多问题,因为它们处理stdin和stdout的方式。但是,python提供了一个“-i”命令行标志,可以解决Windows上的问题。

您所要做的就是:

(setq PyProc (start-process "python" "*Python*" "python" "-i"))
(process-send-string PyProc "1+1;\n")

如果切换到缓冲区 Python ,您将看到“2”作为计算的结果。如果你想很好地看到这个工作,只需使用C-x垂直吐出你的窗口3.切换到右边的 Python 并从左边的缓冲区运行你的代码。

当你准备好杀死Python进程时,只需

(process-send-eof PyProc)

杀死你的缓冲区来清理。希望这有助于那些试图控制Windows平台上的进程的人。