Pregunta comando bash en python no funciona


Me gustaría ejecutar un comando bash desde Python. Mi código:

process = subprocess.Popen(('ifconfig -s'), stdout=subprocess.PIPE, shell=True)
output = process.communicate()[0]
lcd.message(output)
sleep(2)
lcd.clear()

Esto ejecuta "ifconfig -s" y la salida se muestra en una pantalla LCD de 16x2. Demasiada información para esa pantalla. Entonces el nuevo comando es:

ifconfig | awk '$1 {print $1}' FS="  " ORS=,

Funciona perfectamente en un shell pero tengo problemas en el código python. Cuando simplemente cambio los "ifconfig-s" con esto obtengo errores. Creo que esto se debe a los signos '' <quote ...

¿Podrías ayudarme a hacer que el nuevo ifconfig funcione con el código anterior?


0


origen


¿Has intentado escapar de las comillas simples? - Satanicpuppy
En primer lugar, considere usar backticks (`) y escape de citas de cualquier tipo dentro de la cadena concatenada donde sea apropiado, y concatenando el comando en una cadena antes de pasarlo a Popen. - Frank Thomas


Respuestas:


process = subprocess.Popen( 
                            r"ifconfig | awk '$1 {print $1}' FS=' ' ORS=,", 
                            stdout=subprocess.PIPE,
                            shell=True
                           )
output = process.communicate()[0]
lcd.message(output)
sleep(2)
lcd.clear()

Si 'shell = True' y se pasa una secuencia, el comando y sus argumentos se deben enumerar como elementos individuales de la secuencia como ('ifconfig', '- s').
Si se pasa una cadena como se indicó anteriormente, ipc se logra fácilmente porque toda la cadena se pasa al shell cuando shell es verdadero.
Para pasar la secuencia y hacer 'ipc',

process1 = subprocess.Popen( 
                           [ 'ifconfig'],
                           stdout=subprocess.PIPE
                           )
process2 = subprocess.Popen( 
                           [ 'awk','$1 {print $1}', 'FS=" "', 'ORS=,'],
                           stdout=subprocess.PIPE,
                           stdin=process1.stdout
                           )
output = process2.communicate()[0]
lcd.message(output)
sleep(2)
lcd.clear()

0



Si bien esto puede responder la pregunta, sería una mejor respuesta si pudieras dar alguna explicación por qué lo hace - DavidPostill♦