2011-05-22 18 views
9

printbob.py:salida del script en Python desde dentro de un script en Python

import sys 
for arg in sys.argv: 
    print arg 

getbob.py

import subprocess 
#printbob.py will always be in root of getbob.py 
#a sample of sending commands to printbob.py is: 
#printboby.py arg1 arg2 arg3 (commands are seperated by spaces) 

print subprocess.Popen(['printbob.py', 'arg1 arg2 arg3 arg4']).wait() 

x = raw_input('done') 

me sale:

File "C:\Python27\lib\subprocess.py", line 672, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 882, in _execute_child 
    startupinfo) 
WindowsError: [Error 193] %1 is not a valid Win32 application 

¿Qué estoy haciendo mal aquí? Solo quiero obtener el resultado de otro script de python dentro de otro script de python. ¿Debo llamar a cmd.exe o puedo ejecutar printbob.py y enviarle comandos?

Respuesta

8
proc = subprocess.Popen(['python', 'printbob.py', 'arg1 arg2 arg3 arg4'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
print proc.communicate()[0] 

Debe haber una mejor manera de hacerlo, ya que el script también está en Python. Es mejor encontrar alguna forma de aprovechar eso que lo que estás haciendo.

+1

Rastreo (llamada más reciente pasado): Archivo "", línea 1, en subprocess.STDIN AttributeError: 'módulo' el objeto no tiene atributo 'STDIN' – MistahX

+1

Significa STDOUT - corregido. – rfw

+0

Tuve que separar arg1 arg2 en diferentes cadenas de coman separado como '['python', 'printbob.py', 'arg1', 'arg2']' – Quinma

2

Este es el enfoque equivocado.

Debe refactorizar printbob.py para que pueda ser importado por otros módulos de python. Esta versión se puede importar y llamó desde la línea de comandos:

#!/usr/bin/env python 

import sys 

def main(args): 
    for arg in args: 
     print(arg) 

if __name__ == '__main__': 
    main(sys.argv) 

Aquí se le llama desde la línea de comandos:

python printbob.py one two three four five 
printbob.py 
one 
two 
three 
four 
five 

Ahora podemos importar en getbob.py:

#!/usr/bin/env python 

import printbob 

printbob.main('arg1 arg2 arg3 arg4'.split(' ')) 

Aquí se está ejecutando:

python getbob.py 
arg1 
arg2 
arg3 
arg4 
+0

Gracias por la respuesta, pero estaba buscando una forma de ejecutar El código de Python no está en la misma instancia ... debido a algún comportamiento extraño en el hilo, pero sí, la importación de los scripts es normalmente la mejor manera de acceder a su código en otro script. – MistahX

+1

@MistahX: Su comportamiento extraño de subprocesos que le hace pensar que una nueva instancia del intérprete es el camino a seguir parece interesante. Puede haber una mejor manera de abordarlo. ¡Pero esa es una pregunta completamente nueva! – Johnsyweb

0

The shell argument (which defaults to False) specifies whether to use the shell as the program to execute. If shell is True, it is recommended to pass args as a string rather than as a sequence

Simplemente envuelva todos los argumentos en una cadena y hacerle shell=True

proc = subprocess.Popen("python myScript.py --alpha=arg1 -b arg2 arg3" ,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) 
print proc.communicate()[0] 
Cuestiones relacionadas