2011-08-20 16 views
8

In Python, se sto usando "wget" per scaricare un file utilizzando os.system ("wget), mostra sullo schermo come:Python: Come eliminare l'output di os.system

Resolving... 

Connecting to ... 

HTTP request sent, awaiting response... 

100%[====================================================================================================================================================================>] 19,535,176 8.10M/s in 2.3s 

ecc sullo schermo

Cosa posso fare per salvare questa uscita in qualche file piuttosto che mostrare sullo schermo

Attualmente sto facendo funzionare il comando come segue:.?

Theurl = "< posizione del file> "

downloadCmd =" ​​wget "+ Theurl

os.system (downloadCmd)

+3

perché stai chiamando wget in primo luogo invece di utilizzare qualcosa dalla libreria standard di Python? – geoffspear

+0

Puoi spiegarlo con qualche esempio ... – nsh

risposta

5

Per rispondere alla domanda diretta, e come altri hanno menzionato, è consigliabile prendere in considerazione l'utilizzo del modulo subprocess. Ecco un esempio:

from subprocess import Popen, PIPE, STDOUT 

wget = Popen(['/usr/bin/wget', theurl], stdout=PIPE, stderr=STDOUT) 
stdout, nothing = wget.communicate()  

with open('wget.log', 'w') as wgetlog: 
    wgetlog.write(stdout) 

Ma, non c'è bisogno di chiamare fuori per il sistema per scaricare un file, lasciate python fare il lavoro pesante per voi.

Utilizzando urllib,

try: 
    # python 2.x 
    from urllib import urlretrieve 
except ImportError: 
    # python 3.x 
    from urllib.request import urlretrieve 

urlretrieve(theurl, local_filename) 

O urllib2,

import urllib2 

response = urllib2.urlopen(theurl) 
with open(local_filename, 'w') as dl: 
    dl.write(response.read()) 

local_filename è il percorso di destinazione di tua scelta. È a volte possibile determinare automaticamente questo valore, ma l'approccio dipende dalla circostanza.

+0

sto ottenendo il seguente errore: File "python.py", la linea 129 con aperta ('wget.log', 'w') come wgetlog: ^ SyntaxError: invalid syntax – nsh

+0

Senza usare la parola chiave "con "e" come ", funziona correttamente .... wget = Popen (['/ usr/bin/wget', theurl], stdout = PIPE, stderr = STDOUT) stdout, niente = wget.communicate() wgetlog = open ('wget.log', 'w') wgetlog.write (stdout) – nsh

+0

@ nsh Sì, mi dispiace. Il [con istruzione] (http://docs.python.org/reference/compound_stmts.html#the-with-statement) è abilitato di default in python 2.6 e versioni successive, puoi abilitarlo in python 2.5 aggiungendo 'from __future__ import with_statement' come prima importazione. Se stai usando Python 2.4 o precedenti, vedi http://stackoverflow.com/questions/3770348/how-to-safely-open-close-files-in-python-2-4 – Marty

0

Il processo wget è solo scrivendo a STDOUT (e forse STDERR se succede qualcosa di brutto) e questi sono ancora "collegato" al terminale.

Per farlo smettere, reindirizzare (o chiudere) detti filehandle. Guarda il modulo subprocess che consente la configurazione di detti filehandle all'avvio di un processo. (os.system lascia solo l'output/error del processo generato da solo e quindi sono ereditate ma il modulo sottoprocesso è più flessibile.)

Vedi Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects and More per un sacco di bei esempi e spiegazioni (che introduce i concetti di STDIN/STDOUT/STDERR e lavora da lì).

Ci sono probabilmente modi migliori per gestire questo rispetto all'utilizzo di wget - ma lascerò ad altre risposte.

Felice codifica.

+0

Ho importato il sottoprocesso del modulo. Quindi lo sto usando come segue -----> process = subprocess.Popen (downloadCmd, shell = False, stdout = subprocess.PIPE) Ma mi sta dando l'errore: File "/usr/lib64/python2.4/ subprocess.py", la linea 550, in __init__ errread, errwrite) File "/usr/lib64/python2.4/subprocess.py", la linea 996, in _execute_child rilancio child_exception OSError: [Errno 2] Nessun file o la directory – nsh

20

Le funzioni os.system eseguono il comando tramite una shell, quindi è possibile inserire anche eventuali reindirizzamenti stdio. Dovresti anche usare il flag -q (quiet) su wget.

cmd = "wget -q " + theurl + " >/dev/null 2>&1" 

Tuttavia, ci sono modi migliori di fare questo in pitone, come ad esempio l'involucro pycurl per libcurl, o il modulo "magazzino" urllib2.

1

Come altri hanno notato, è possibile utilizzare i moduli della libreria nativa Python per eseguire l'I/O, oppure è possibile modificare la riga di comando per reindirizzare l'output.

Ma per il controllo completo dell'output, la cosa migliore è usare il modulo Python subprocess invece di os.system(). L'utilizzo di subprocess consente di acquisire l'output e di esaminarlo o di inserire dati arbitrari in input standard.

Quando si desidera un modo rapido e sporco per eseguire qualcosa, utilizzare os.system(). Quando si desidera il pieno controllo su come si esegue qualcosa, utilizzare subprocess.

Problemi correlati