¿Cómo se usa subprocess.check_output () en Python?

He encontrado documentación sobre subprocess.check_output () pero no puedo encontrar una con argumentos y la documentación no es muy profunda. Estoy usando Python 3 (pero estoy intentando ejecutar un archivo de Python 2 a través de Python 3)

Estoy intentando ejecutar este comando: python py2.py -i test.txt

-i es un argumento posicional para argparse, test.txt es lo que es -i, py2.py es el archivo a ejecutar

He probado muchas variaciones (que no funcionan) incluyendo: py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])

La respuesta correcta (utilizando Python 2.7 y check_output() posteriores, desde que se introdujo check_output() ese momento ) es:

 py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt']) 

Para demostrar, aquí están mis dos progtwigs:

py2.py:

 import sys print sys.argv 

py3.py:

 import subprocess py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt']) print('py2 said:', py2output) 

Ejecutandolo

 $ python3 py3.py py2 said: b"['py2.py', '-i', 'test.txt']\n" 

Esto es lo que está mal con cada una de sus versiones:

 py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt']) 

Primero, str('python py2.py') es exactamente lo mismo que 'python py2.py' estás tomando un str y llamando a str para convertirlo en un str . Esto hace que el código sea más difícil de leer, más largo e incluso más lento, sin agregar ningún beneficio.

Más en serio, python py2.py no puede ser un solo argumento, a menos que esté intentando ejecutar un progtwig llamado, por ejemplo, /usr/bin/python\ py2.py Que no eres estás intentando ejecutar, por ejemplo, /usr/bin/python con el primer argumento py2.py Por lo tanto, es necesario hacer que los elementos separados en la lista.

Tu segunda versión corrige eso, pero te falta el ' before test.txt' . Esto debería proporcionarle un SyntaxError , que probablemente diga EOL while scanning string literal .

Mientras tanto, no estoy seguro de cómo encontró la documentación pero no pude encontrar ningún ejemplo con argumentos. El primer ejemplo es:

 >>> subprocess.check_output(["echo", "Hello World!"]) b'Hello World!\n' 

Eso llama al comando "echo" con un argumento adicional, "Hello World!" .

También:

-i es un argumento posicional para argparse, test.txt es lo que es -i

Estoy bastante seguro de que -i no es un argumento posicional, sino un argumento opcional. De lo contrario, la segunda mitad de la oración no tiene sentido.

Añadiendo a lo mencionado por @abarnert

Una mejor es atrapar la excepción.

 import subprocess try: py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'],stderr= subprocess.STDOUT) #print('py2 said:', py2output) print "here" except subprocess.CalledProcessError as e: print "Calledprocerr" 

this stderr = subprocess.STDOUT es para asegurarse de que no reciba el error filenotfound en stderr- que no puede ser atrapado en filenotfoundexception, de lo contrario, terminaría recibiendo

 python: can't open file 'py2.py': [Errno 2] No such file or directory 

De hecho, una mejor solución para esto podría ser verificar si el archivo / scripts existe y luego ejecutar el archivo / script