Estoy trabajando en algo como compilar, y estoy tratando de compilar ensamblador y obtener la información de salida al respecto usando subprocess.

Cuando estoy usando subprocess.call todo funciona bien como:

(Le agrego algo de spam para que genere un error)

Version : Python3.5

In [12]: subprocess.call(['as','-32','test.s'])
test.s: Assembler messages:
test.s:3: Error: no such instruction: `zxvasdf'
Out[12]: 1

Pero cuando uso subprocess.getoutput:

In [13]: subprocess.getoutput(['as','-32','test.s'])

Simplemente se congela y no hace nada.

¿Cómo puedo resolver este problema?

Gracias por cualquier consejo

1
KIDJourney 14 may. 2016 a las 05:18

3 respuestas

La mejor respuesta

El problema como @Lex Scarisbrick notó correctamente es que getoutput(cmd) espera un comando de shell como una cadena. Si le pasa una lista; los argumentos adicionales se pasan al shell en POSIX, no al proceso 'as' en sí mismo. Significa que el programa 'as' se ejecuta sin ningún argumento de línea de comandos.

Simplemente se congela y no hace nada.

Parece que as invocado sin argumentos de línea de comandos espera su entrada en stdin. Puede comenzar a escribir algún ensamblador y presionar Ctrl+D para indicar EOF. Si no proporciona aportes; Colgará para siempre.

Consulte ¿Por qué el subproceso.Popen no funciona cuando args es secuencia?

Si desea leer ambos stdout, stderr del subproceso 'as'; podrías usar subprocess.run():

#!/usr/bin/env python3
import subprocess

p = subprocess.run(['as','-32','test.s'],
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE, # capture separately 
                   universal_newline=True) # decode bytes
print("Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=p))

Nota: no use shell=True aquí.

3
Community 23 may. 2017 a las 10:28

Bueno, parece que puedo usar subprocess.PIPE para resolver el problema.

In [16]: proc = subprocess.Popen(['as','-32','test.s'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

In [17]: for i in proc.stderr:
   ....:     print(i)
   ....:     
b'test.s: Assembler messages:\n'
b"test.s:3: Error: no such instruction: `zxvasdf'\n"

Pero no entiendo por qué me va bien.

Voy a consultar el documento para más detalles.

Gracias por todas.

0
KIDJourney 14 may. 2016 a las 02:27

subprocess.getouput() no toma una lista como la entrada como lo hace subprocess.call(). Toma un solo argumento como una cadena. Cámbielo a:

subprocess.getoutput('as -32 test.s')
1
Lex Scarisbrick 14 may. 2016 a las 02:33