No se puede enviar información al programa en ejecución en Sublime Text

Resuelto Rook asked hace 10 años • 5 respuestas

Estoy intentando que Sublime Text 3 ejecute un script de Python. Una simple línea de dos

var = raw_input("Enter something: ")
print("You entered " + var)

que solicita información, la espera y luego la imprime en el indicador de la consola de Windows.

Al ver la cantidad de preguntas similares en el sitio, esto es un problema para muchos usuarios, así que las revisé y probé... cosas. Hice una copia del archivo exec.py, comenté esa línea, hice un nuevo archivo de compilación pythonw, intenté modificar el archivo de compilación... nada parece funcionar.

A falta de una solución definitiva, ¿cómo se trabaja con la entrada utilizando Sublime Text?

Rook avatar Oct 09 '13 00:10 Rook
Aceptado

Sublime Text por sí solo no puede manejar la entrada a través de raw_input()(Python 2) o input()(Python 3). Lo mismo ocurre con otros lenguajes: Ruby gets, la clase de Java , la clase Scannerde Node , en C, en C++, etc. Una solución a corto plazo es obtener Package Control si aún no lo tiene y luego instalar SublimeREPL . Le permite transferir o ejecutar parte o la totalidad de su código a través del REPL en ejecución. Es posible que sea necesario realizar alguna configuración de los archivos para que su intérprete preferido se ejecute correctamente. Alternativamente, puede utilizar el excelente complemento Terminus ; los detalles se encuentran en la parte inferior.readlinescanfcinMain.sublime-menu

Si el código que estás ejecutando no funciona bien con SublimeREPL (por ejemplo, estás usando C/C++/Java/etc. y necesitas compilar el código antes de ejecutarlo), o simplemente quieres ejecutarlo independientemente de Sublime , necesitarás crear tu propio sistema de compilación . Guarde lo siguiente como Packages/User/Python_cmd.sublime-build:

ventanas

{
    "cmd": ["start", "cmd", "/k", "c:/python38/python.exe", "$file"],
    "selector": "source.python",
    "shell": true,
    "working_dir": "$file_dir",
    "env": {"PYTHONIOENCODING": "utf-8"}
}

cambiando la ruta a su ejecutable de Python según corresponda. Luego, vaya Tools -> Build Systemy seleccione Python_cmd, y cuando presione para compilar, se abrirá CtrlBuna nueva ventana con su archivo ejecutándose. cmdLa /kopción regresa al símbolo del sistema, sin cerrar la ventana, una vez que el programa termina de ejecutarse para que pueda examinar la salida, los rastreos, etc.

Tenga en cuenta que este sistema de compilación es específico de Windows, ya que macOS y Linux no lo tienen cmd. Los sistemas de compilación para esas plataformas se encuentran a continuación.


Mac OS

Si está ejecutando OS X/macOS, el siguiente sistema de compilación abrirá su programa en una nueva instancia de Terminal. Guárdalo como Packages/User/Python_Terminal.sublime-build. En mis pruebas en macOS 10.15, la ventana Terminal no siempre aparecía en la parte superior cuando se activaba, por lo que es posible que necesites buscarla detrás de otras ventanas.

{
    "shell_cmd": "osascript -e 'tell app \"Terminal\" to do script \"cd $file_path && python3 -u $file\"'",
    "working_dir": "$file_path",
    "selector": "source.python",
    "env": {"PYTHONIOENCODING": "utf-8"}
}

Es posible que deba especificar la ruta a su ejecutable de Python si no está en su archivo $PATH.


linux

Y finalmente, aquí hay un sistema de compilación para Linux. Fue probado en Ubuntu, por lo que si usa otra distribución deberá asegurarse de que gnome-terminalesté instalada. Guárdalo como Packages/User/Python_shell.sublime-build. Una vez que el programa haya terminado de ejecutarse, presione cualquier tecla para cerrar la ventana.

{
    "shell_cmd": "gnome-terminal --working-directory=$file_path -- bash -c 'python3 -u \"$file\" && read -n 1 -s -r'",
    "working_dir": "$file_path",
    "selector": "source.python",
    "env": {"PYTHONIOENCODING": "utf-8"}
}

Como referencia, el Packagesdirectorio es el que se abre al seleccionar Preferences → Browse Packages…:

  • Linux: ~/.config/sublime-text-3/Packageso~/.config/sublime-text/Packages
  • OS X: ~/Library/Application Support/Sublime Text 3/Packageso~/Library/Application Support/Sublime Text/Packages
  • Instalación normal de Windows: oC:\Users\YourUserName\AppData\Roaming\Sublime Text 3\PackagesC:\Users\YourUserName\AppData\Roaming\Sublime Text\Packages
  • Instalación portátil de Windows:InstallationFolder\Sublime Text 3\Data\Packages InstallationFolder\Sublime Text\Data\Packages

La ruta exacta depende de la versión y de si actualizó o no desde Sublime Text 3.

Solo he probado estos sistemas de compilación con Python, pero deberían funcionar bien en cualquier idioma. Al modificar, simplemente asegúrese de que todas las comillas simples y dobles coincidan; obtendrá errores o un comportamiento inesperado si no es así.


ACTUALIZAR

Existe un complemento independiente de la plataforma llamado Terminus que, entre otras cosas, proporciona un reemplazo directo para el execmotor del sistema de compilación predeterminado. Le permite interactuar con su programa en el panel de compilación debajo de su código. Una vez que lo haya instalado desde Package Control, cree el siguiente sistema de compilación (nuevamente, para Python):

{
    "target": "terminus_exec",
    "cancel": "terminus_cancel_build",
    "cmd": [
        "/path/to/python", "-u", "$file"
    ],
    "working_dir": "$file_path",
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
}

Deberá ajustar la ruta a su ejecutable de Python, como se indica arriba. Asegúrese de leer la documentación para descubrir todas las otras formas en que puede utilizar este fantástico complemento.

MattDMo avatar Oct 10 '2013 13:10 MattDMo

Para agregar a la respuesta de Shritam Kumar Mund , para hacer un enlace de clave para esto:

{ "keys": ["alt+k", "alt+k"], "command": "repl_open", "args": {"cmd": ["python", "-u", "$file_basename" ], "cwd": "$file_path", "encoding": "utf8", "extend_env": {"PYTHONIOENCODING": "utf-8"}, "external_id": "python", "syntax": "Paquetes/ Python/Python.tmLanguage", "tipo": "subproceso"}},

Encontré esto usando lo siguiente en la consola:

sublime.log_commands(True)
perplexed avatar Aug 20 '2021 05:08 perplexed