2017-08-13 37 views
0

背景Python的子過程沒有得到輸入或發回結果

我寫一個小包裝農場出來的Emacs Lisp計算爲Python子進程,所以我沒有重現複雜數字例程。對於我的特殊問題,我需要Python作爲子進程,因爲我需要維護Python完成的一些耗時的計算。對於小事,我可以通過shell命令將計算髮送到Python來完成很好的事情。但是,我需要更密集的東西的子過程。

SETUP

  1. GNU Emacs的25.2.1的Windows 10下

  2. 蟒蛇的的Python 3.5分發用於Windows 10

樣品運行

從任何緩衝區中,點擊M-x ielm。這將啓動IELM Emacs Lisp外殼。這裏是我的會話中的幾分鐘前:

*** 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> 

當你運行上面的Emacs Lisp在IELM(或任何你想要的方式),你可以觀看蟒蛇緩衝區。沒有顯示。然而,正如你清楚地看到的,我可以殺死進程並查詢它的運行狀態。

問題

爲什麼Python進程無法顯示在蟒蛇緩衝什麼嗎?我已經使用MySQL來完成遠程服務器(使用本地安裝的MySQL)而沒有任何問題。

回答

0

我已經做了一些調查。我有一個部分的解決方法。但是,我仍然不知道爲什麼使用啓動過程的原始嘗試不起作用。

我知道,一個可以使用

M-x run-python 

推出劣質Python進程。然後我們可以使用使用

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

其中PyProc是牽着你的進程對象的符號。這將命令發送給劣質進程並按回車鍵。奇怪的是,「1 + 1 \ n」不顯示在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) 

儘管如此終止進程不知道爲什麼我不能簡單地用啓動過程。

0

在我的第一個回答上面,我使出

(setq PyProc (run-python)) 

運行Python作爲一個子進程,因爲我一直沒能使用的功能的啓動進程來運行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平臺上的進程。