script run batch python scripting batch-file

run - python como una secuencia de comandos "por lotes"(es decir, ejecute comandos de python)



python batch (4)

Estoy trabajando en un entorno de Windows (¡mi computadora portátil!) Y necesito un par de scripts que ejecuten otros programas, más o menos como un archivo de lote de Windows.

¿Cómo puedo ejecutar un comando desde Python para que el programa cuando se ejecuta reemplace el script? El programa es interactivo (por ejemplo, al unísono) y mantiene las líneas de impresión y solicita la entrada del usuario todo el tiempo.

Por lo tanto, solo ejecutar un programa e imprimir la salida no será suficiente. El programa tiene que hacerse cargo de la entrada / salida del script, bastante mcuh como ejecutar el comando desde un archivo .bat.

Intenté os.execl pero me sigue diciendo "argumentos inválidos", también, no encuentra el nombre del programa (no busca la variable PATH); Tengo que darle el camino completo ..?!

básicamente, en un script por lotes puedo escribir: perfil de unísono

¿Cómo puedo lograr el mismo efecto en Python?

EDITAR:

Descubrí que se puede hacer con os.system( ... ) y como no puedo aceptar mi propia respuesta, cierro la pregunta.

EDITAR: se suponía que era un comentario, pero cuando lo publiqué no tenía muchos puntos.

Gracias Claudiu, eso es más o menos lo que quiero, excepto por una pequeña cosa: quiero que la función termine cuando el programa termine, pero cuando lo intento al unísono, no devuelve el control al script de python, sino a las ventanas entorno de línea de comando

>>> os.execlp("unison") C:/>Usage: unison [options] or unison root1 root2 [options] or unison profilename [options] For a list of options, type "unison -help". For a tutorial on basic usage, type "unison -doc tutorial". For other documentation, type "unison -doc topics". C:/> C:/> C:/>

¿Cómo evitar esto?


os.execlp debería funcionar. Esto buscará en tu camino el comando. No le des argumentos si no son necesarios:

>>> import os >>> os.execlp("cmd") D:/Documents and Settings/Claudiu>Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. D:/Documents and Settings/Claudiu>


import subprocess proc = subprocess.Popen([''unison'', ''profile''], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE) proc.stdin.write(''user input'') print proc.stdout.read()

Esto debería ayudarte a comenzar. ¡Por favor edite su pregunta con más información si quiere una respuesta más detallada!


Debe crear un nuevo proceso utilizando el módulo de subproceso .

No domino los procesos de Windows, pero su función Popen es multiplataforma, y ​​debería preferirse a las soluciones específicas del sistema operativo.

EDITAR: Sigo diciendo que deberías preferir el módulo de Subproceso a las funciones específicas de OS. * OS, es multiplataforma y más pitónico (solo google). Puede esperar el resultado de manera fácil y limpia :

import os import subprocess unison = os.path.join(os.path.curdir, "unison") p = subprocess.Popen(unison) p.wait()


Descubrí que os.system hace lo que quiero,

Gracias por todos los que trataron de ayudar.

os.system("dir")

ejecuta el comando como si se hubiera ejecutado desde un archivo por lotes