2008-11-22 7 views
6

Estoy trabajando en un entorno Windows (¡mi computadora portátil!) Y necesito un par de scripts que ejecuten otros programas, como un archivo de lote de Windows.python como script "por lotes" (es decir, ejecute comandos de python)

¿cómo puedo ejecutar un comando desde Python de modo 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, 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 archivo por lotes que puedo escribir: perfil unísono

cómo puedo conseguir el mismo efecto en Python?

EDIT:

descubrí que se puede hacer con os.system(...) y ya que no puedo aceptar mi propia respuesta, voy a cerrar 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 se cierra, pero cuando lo intento al unísono, no devuelve el control al script de python, pero para el entorno de línea de comandos de windows

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

+0

Ayuda a proporcionar la secuencia de comandos que no funciona. –

+0

No es necesario cerrar la pregunta porque no puede aceptar su respuesta. Si es el más votado, es básicamente el mismo que el aceptado ... Un poco molesto, ciertamente, pero cerrar no es la forma correcta de hacerlo, diría ... – dbr

Respuesta

6

descubrí que os.system hace lo que yo quiero,

Gracias por todo lo que trataron de ayudar.

os.system("dir") 

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

+0

¡No puedo hacer eso! – hasen

17

Debe crear un nuevo proceso utilizando subprocess module.

No soy fluido en los procesos de Windows, pero su función Popen es multiplataforma, y ​​debe ser preferible a las soluciones específicas del sistema operativo.

EDITAR: Sigo diciendo que debe preferir el módulo de subproceso a os. * Funciones específicas del sistema operativo, es multiplataforma y más pitónico (solo google). Puede esperar a que el resultado fácilmente, y limpiamente :

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

Voto irrazonable. +1 –

+0

Lo siento, mi culpa. Estaba seguro de que el subproceso no conectaría STDIN/STDOUT cuando se usara así. Aparentemente es muy tarde para deshacer mi voto. –

2

os.execlp debería funcionar. Esto buscará en tu camino el comando. No darle ningún args 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> 
+2

debe usar el módulo 'subproceso' – orip

4
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 ayudar a empezar. ¡Por favor edite su pregunta con más información si quiere una respuesta más detallada!

Cuestiones relacionadas