¿Cómo obtener datos de la línea de comandos desde un progtwig Python?

Quiero ejecutar un progtwig de línea de comandos desde un script de Python y obtener el resultado.

¿Cómo obtengo la información que muestra foo para poder usarla en mi script?

Por ejemplo, llamo foo file1 desde la línea de comandos y se imprime

 Size: 3KB Name: file1.txt Other stuff: blah 

¿Cómo puedo obtener el nombre del archivo haciendo algo como filename = os.system('foo file1') ?

Utilice el módulo de subproceso:

 import subprocess command = ['ls', '-l'] p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE) text = p.stdout.read() retcode = p.wait() 

Luego, puede hacer lo que quiera con text variable: expresión regular, división, etc.

Los parámetros segundo y tercero de subprocess.Popen son opcionales y se pueden eliminar.

La forma más fácil de obtener el resultado de una herramienta llamada a través de su secuencia de comandos de Python es usar el módulo de subproceso en la biblioteca estándar. Echa un vistazo a subprocess.check_output .

 >>> subprocess.check_output("echo \"foo\"", shell=True) 'foo\n' 

(Si su herramienta obtiene información de fonts que no son de confianza, asegúrese de no usar el argumento shell=True ).

Este suele ser un tema para un script de bash que puede ejecutar en python:

 #!/bin/bash # vim:ts=4:sw=4 for arg; do size=$(du -sh "$arg" | awk '{print $1}') date=$(stat -c "%y" "$arg") cat< 

Edición: Cómo usarlo : abre un pseuso-terminal, luego copia y pega esto:

 cd wget http://pastie.org/pastes/2900209/download -O info-files.bash 

En python2.4:

 import os import sys myvar = ("/bin/bash ~/info-files.bash '{}'").format(sys.argv[1]) myoutput = os.system(myvar) # myoutput variable contains the whole output from the shell print myoutput 

Esta es una solución portátil en python puro:

 import os import stat import time # pick a file you have ... file_name = 'll.py' file_stats = os.stat(file_name) # create a dictionary to hold file info file_info = { 'fname': file_name, 'fsize': file_stats [stat.ST_SIZE], 'f_lm': time.strftime("%m/%d/%Y %I:%M:%S %p",time.localtime(file_stats[stat.ST_MTIME])), } print(""" Size: {} bytes Name: {} Time: {} """ ).format(file_info['fsize'], file_info['fname'], file_info['f_lm']) 

En Python, puede pasar un comando de sistema operativo simple con espacios, subcotizaciones y nuevas líneas en el módulo de subcommand para que podamos analizar el texto de respuesta de esta manera:

  1. Guarda esto en test.py:

     #!/usr/bin/python import subprocess command = ('echo "this echo command' + ' has subquotes, spaces,\n\n" && echo "and newlines!"') p = subprocess.Popen(command, universal_newlines=True, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) text = p.stdout.read() retcode = p.wait() print text; 
  2. Entonces ejecútalo así:

     python test.py 
  3. Que imprime:

     this echo command has subquotes, spaces, and newlines! 

Si esto no funciona, podría haber problemas con la versión de Python o el sistema operativo. Estoy usando Python 2.7.3 en Ubuntu 12.10 para este ejemplo.