背景
我正在编写一个小包来将Emacs Lisp计算变为Python子流程,因此我不必重现复杂的数值例程。对于我的特殊问题,我需要Python作为子流程,因为我需要维护Python完成的某些耗时的计算。对于小事情,我可以通过shell命令向Python发送计算来完美地完成任务。但是,我需要更加密集的子流程。
SETUP
Windows 10下的GNU Emacs 25.2.1
Anaconda用于Windows 10的Python 3.5发行版
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)没有问题。
答案 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平台上的进程的人。