2017-08-13 1 views
0

CONTEXTEPython sous-processus dans Emacs ne pas obtenir l'entrée ou RENVOYER Résultats

Je suis en train d'écrire un petit paquet à la ferme des calculs Emacs Lisp à un sous-processus Python donc je n'ai pas reproduire compliqué routines numériques. Pour mon problème particulier, j'ai besoin de Python en tant que sous-processus car j'ai besoin de maintenir certains calculs fastidieux effectués par Python. Pour les petites choses, je peux faire des choses parfaitement bien en envoyant des calculs à Python via des commandes shell. Cependant, j'ai besoin du sous-processus pour des choses plus intensives.

SETUP

  1. GNU Emacs 25.2.1 sous Windows 10

  2. Répartition Python 3.5 Anaconda pour Windows 10

EXEMPLE RUN

À partir de n'importe quel tampon, appuyez sur M-x ielm. Cela fera apparaître le shell IELM Emacs Lisp. Voici une transcription de ma séance il y a quelques instants:

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

que vous exécutez ci-dessus Emacs Lisp IELM (ou quelque manière que vous voulez), vous pouvez regarder le tampon python. Rien ne s'affiche. Cependant, comme vous le voyez clairement, je peux tuer le processus et interroger son état de fonctionnement.

PROBLÈME

Pourquoi le processus Python ne peut pas afficher quelque chose dans le tampon python? Je l'ai fait avec MySQL à un serveur distant (en utilisant l'installation locale de MySQL) sans aucun problème.

Répondre

0

J'ai fait quelques recherches. J'ai une solution de contournement partielle. Cependant, je n'ai toujours pas la moindre idée de la raison pour laquelle la tentative originale utilisant start-process ne fonctionne pas.

Je sais que l'on peut utiliser

M-x run-python 

pour lancer un processus Python inférieur. On peut alors utiliser l'utilisation

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

PyProc est le symbole tenant votre objet de processus. Cela envoie la commande au processus inférieur et appuie sur retour. La chose étrange est que le "1 + 1 \ n" ne s'affiche pas dans le tampon Python. La valeur renvoyée s'affiche. Stocker le point avant et après la sortie, il est alors facile de récupérer la sortie de Python.Voici un extrait partiel:

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

Évaluation des Résultat vous donne

Result -> "2" 

Vous pouvez mettre fin au processus en utilisant

(process-send-eof PyProc) 

Je ne sais toujours pas pourquoi je ne peux pas utiliser simplement début du processus

0

Dans ma première réponse ci-dessus, je recours à

(setq PyProc (run-python)) 

pour exécuter Python comme un processus inférieur puisque je ne l'avais pas été en mesure de lancer Python en utilisant la fonction processus de démarrage. Selon la documentation de GNU Emacs, il peut y avoir beaucoup de problèmes avec les programmes DOS à cause de la façon dont ils gèrent stdin et stdout. Cependant, python fournit un indicateur de ligne de commande "-i" qui résout le problème sur Windows.

Tout ce que vous avez à faire est:

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

Si vous passez à tampon Python, vous verrez « 2 » que le résultat du calcul. Si vous voulez voir ce travail bien, crachez votre fenêtre verticalement en utilisant C-x 3. Passez à Python sur la droite et exécutez votre code à partir du tampon gauche.

Lorsque vous êtes prêt à tuer le processus Python, juste

(process-send-eof PyProc) 

vous tuer en mémoire tampon pour nettoyer. J'espère que cela aidera ceux qui essaient de contrôler les processus sur la plate-forme Windows.