Ejecutar ipython de forma remota

9

Estoy tratando de ejecutar un intérprete de ipython de forma remota (con Emacs 24.5 y nativo python.el), pero no estoy seguro de tener el enfoque correcto: cada vez que intento ejecutar un comando de este tipo (que se activa con C-c C-c):

Run Python: /ssh:<server_name>:/usr/local/bin/ipython -i

(con <server_name>una entrada válida en my ~/.ssh/configy ipythondisponible en esa ubicación remota), aparece un error como:

Warning (emacs): Python shell prompts cannot be detected.
If your emacs session hangs when starting python shells
recover with `keyboard-quit' and then try fixing the
interactive flag for your interpreter by adjusting the
`python-shell-interpreter-interactive-arg' or add regexps
matching shell prompts in the directory-local friendly vars:
  + `python-shell-prompt-regexp'
  + `python-shell-prompt-block-regexp'
  + `python-shell-prompt-output-regexp'
Or alternatively in:
  + `python-shell-prompt-input-regexps'
  + `python-shell-prompt-output-regexps'

tanto como:

env: /ssh:<server_name>:/usr/local/bin/ipython: No such file or directory

en un *Python*búfer .. ¿Está haciendo uso de tramp, y es python.elcapaz de ejecutar intérpretes remotos de tal manera?

cjauvin
fuente

Respuestas:

5

Una forma es usar *eshell*.

  • M-x eshell
  • cd /ssh:<server_name>:~
  • run-python /usr/bin/ipython
  • Cambiar al *Python*búfer.
PythonNut
fuente
3
Esto es bueno, pero esto no permite enviar código al búfer de Python . ¿Es eso correcto?
BakaKuna
@BakaKuna Resolví esa verificación de mi respuesta
atevm
4

@ serv-inc answear es el mejor enfoque aquí:

(setq python-shell-interpreter "ssh yourhost ipython" python-shell-interpreter-args "--simple-prompt -i")

pero seguirá fallando con el error:

No such file or directory, ssh\

Debe hacer referencia a un ejecutable en su ruta, para que los comandos de shell directos no se reproduzcan, pero escribir un script de contenedor lo resolverá, vamos a nombrarlo remote-python:

#!/usr/bin/env bash
ssh hostname -t "ipython $@"

-t forzará la asignación de pseudo terminal.

$@ delegará todos los argumentos recibidos al ipython remoto.

Este script debe estar en un directorio que esté definido en su PATHvariable. Puede verificar esto dentro de Emacs con:

(getenv "PATH")

entonces puede establecer remot-pythoncomo su intérprete:

(setq python-shell-interpreter "remote-python"
            python-shell-interpreter-args "-i --simple-prompt")

Si recibe una advertencia sobre el soporte de línea roja:

(setq python-shell-completion-native-enable nil)

Nota:

La belleza de este método es que debería funcionar con casi todos los intérpretes. También lo probé con el REPL de julia-mode y puedes escribir una función interactiva para cambiar tus intérpretes remotos / locales.

atevm
fuente
Es bueno saber que ayudó un poco. Gracias
serv-inc
0

Intenta evaluar (o incluso en .emacs)

(setq python-shell-interpreter "ssh yourhost ipython"
      python-shell-interpreter-args "--simple-prompt -i")

y use como su evaluación local en cualquier archivo de Python.

La primera línea establece el control remoto ipythoncomo su intérprete predeterminado. La segunda línea corrige un problema de ipython.

serv-inc
fuente