/ / ¿Cómo llamar a Popen con una cáscara diferente? - python, windows, shell, subprocess

¿Cómo llamar a Popen con una concha diferente? - python, windows, shell, subprocess

Estoy escribiendo una herramienta que toma una serie de comandos y los ejecuta.

Los comandos deben escribirse como si se escribieran en un terminal / consola. Para eso, utilicé Popen() con shell=True para imitar el comportamiento de alguien que escribe en una terminal / consola.

Ahora me gustaría permitir que el usuario especifique el intérprete de comandos que le gusta. Más precisamente, en Windows, uno puede decidir usar su "Git bash" en lugar de cmd.exe.

De acuerdo a Popen()"s documentación, la elección del intérprete a utilizar se realiza a través de la variable de entorno COMSPEC.

Traté de establecer COMSPEC a C:Program Files (x86)Gitbinbash.exe antes de la llamada, pero falla, porque subproceso agrega /c al comando, mientras base espera -c.

Pensé en no usar shell=True pero entonces no sé exactamente cuáles son las diferencias:

  • Debería .split() La línea de comandos en argumentos? Si es así, cómo ?
  • ¿Hay alguna bandera que shell=True implica / set?

El objetivo aquí es no volver a implementar la "magia" en el interior. Popen(shell=True) sin dejar de imitarlo lo mejor que puedo.

Alguna idea ?

Respuestas

7 para la respuesta № 1

shell=True es casi universalmente lo incorrecto, y eso no es diferente aquí. En este caso, donde your_command es una cadena creada para analizar por bash, use:

subprocess.Popen([r"C:Program Files (x86)Gitbinbash.exe", "-c", your_command])

... y ese comando será analizado solo por el shell especificado (el proporcionado por Git), en lugar de que el shell lo analice en COMSPEC para generar un comando para su uso por bash.