2011-11-21 9 views
16

Voglio eseguire un programma da riga di comando all'interno di uno script python e ottenere l'output.Come ottenere dati da linea di comando all'interno di un programma Python?

Come posso ottenere le informazioni visualizzate da foo in modo da poterle utilizzare nel mio script?

Per esempio, che io chiamo foo file1 dalla riga di comando e esso stampa

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

Come posso ottenere il nome del file di fare qualcosa di simile filename = os.system('foo file1')?

+1

possibile duplicato di [Esecuzione di programmi da riga di comando all'interno di python] (http://stackoverflow.com/questions/450285/executing-command-line-programs-from-within-python) – Daenyth

risposta

18

utilizzare il modulo sottoprocesso:

import subprocess 

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

allora si può fare quello che vuoi con variabile text: espressione regolare, la scissione, ecc

il 2 e 3 i parametri di subprocess.Popen sono opzionali e possono essere rimosso.

+2

... dove 'comando' dovrebbe essere '['foo', 'file1', 'file2', ...]'. +1. –

+0

Grazie! Quindi l'output di foo è tutto in testo ... Ora come faccio a ottenere il nome del file da quello? È come un array o qualcosa in cui posso ottenere il testo [1]? Oppure posso cercare attraverso "Nome:"? Oppure iniziare dal carattere n. 7 della linea n. – user1058492

+1

Guardate il modulo re e scrivete una semplice espressione regolare che la tira in '' pat = re.compile (r'Name: \ s + (. *) $ ') M = pat.search (testo) se m: m. group (1) '' (è necessario aggiungere alcune newline) – koblas

4

Il modo più semplice per ottenere l'output di uno strumento chiamato tramite lo script Python è utilizzare il modulo subprocess nella libreria standard. Dai un'occhiata a subprocess.check_output.

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

(Se lo strumento riceve input da fonti non attendibili, fare attenzione a non utilizzare l'argomento shell=True.)

2

Questo è in genere un soggetto per uno script bash che è possibile eseguire in Python:

#!/bin/bash 
# vim:ts=4:sw=4 

for arg; do 
    size=$(du -sh "$arg" | awk '{print $1}') 
    date=$(stat -c "%y" "$arg") 
    cat<<EOF 
Size: $size 
Name: ${arg##*/} 
Date: $date 
EOF 

done 

Edit: Come usarlo: aprire un pseuso-terminal, quindi copiare e incollare questo:

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

In 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 
+1

Non so nulla di bash. Come lo uso con Python? – user1058492

+0

Vedere la mia modifica nel mio post;) –

+0

Questa soluzione è solo per Linux o Windows se si dispone di Cygwin http://en.wikipedia.org/wiki/Cygwin Se si utilizza Windows o se si desidera una soluzione portatile, guarda il mio nuovo post –

1

Si tratta di una soluzione portatile in puro python:

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']) 
2

In Python, è possibile passare un comando operativo pianura con spazi, subquotes e ritorni a capo nel subcommand modulo in modo che possiamo analizzare il testo di risposta in questo modo:

  1. Salva questo in 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. quindi eseguirlo in questo modo:

    python test.py 
    
  3. che stampa:

    this echo command has subquotes, spaces, 
    
    
    and newlines! 
    

Se questo non funziona per voi, potrebbe essere problemi con il pitone versione o il sistema operativo. Sto usando Python 2.7.3 su Ubuntu 12.10 per questo esempio.

Problemi correlati