PDA

View Full Version : [Python]os.popen ed esecuzione script


pmhwp
14-05-2010, 22:43
Ciao,
ho uno script al cui interno richiamo un comando da shell con os.popen che produce dell'output.

print ("\n .............LOADING SHELL COMMAND ")
cmd = os.popen(data["om_points"], "w")
Vorrei far si che quando viene lanciato os.popen lo script aspetti che il comando venga terminato prima di proseguire con l'eseczione dei comandi successivi.

Ho provato a modificarlo in questo modo ma non funziona:
print ("\n .............LOADING SHELL COMMAND ")
cmd = os.popen(data["om_points"], "w").wait()

E mi viene ritornato un errore.

Come posso fare?
Grazie.

Ryuzaki_Eru
14-05-2010, 23:54
os.popen è una funzione che restituisce un oggetto file. Come fai a chiamare un metodo wait() con esso? Per questo ottieni errore. Se tu vuoi solo eseguire allora vengono eseguiti i comandi, se vuoi pure l'output allora usa commands.getoutput().

pmhwp
14-05-2010, 23:59
Ok il problema però è che voglio eseguire un comando shell da uno script python e aspettare che sia terminato prima di eseguire i successivi comandi dello script.

Come devo fare?

Grazie.

Ryuzaki_Eru
15-05-2010, 00:07
Ma lo script non ti va avanti se il comando non ti termina. Posta il codice che hai scritto fino ad ora e mettilo sotto il tag CODE gentilmente.

pmhwp
15-05-2010, 00:13
#!/usr/bin/python

print ("\n .............LOADING OM_POINTS ")
cmd="om_points -o xml"
om_points = os.popen(cmd, "w")

#altri comandi script
........
........
........


Il problema è che il comando om_points è un processo che stampa in modo asincrono quello che esegue (cerca e scarica un documento xml stampandolo su schermo).
Lo script quindi non aspetta che sia terminato e continua eseguendo gli altri comandi dello script che sono sotto.

Grazie.

Ryuzaki_Eru
15-05-2010, 00:23
Prova con:

while om_points.readline():
fai qualcosa

nico159
15-05-2010, 00:32
Leggere la documentazione di Python è sempre utile ;)
http://docs.python.org/library/subprocess.html#subprocess.call

pmhwp
15-05-2010, 00:34
Risolto con:
status, text = getstatusoutput(cmd)

Grazie a tutti.

Ryuzaki_Eru
15-05-2010, 00:54
Te l'avevo suggerito dall'inizio il modulo commands, pensavo che lo avessi almeno guardato. Poi c'è anche subprocess come ha consigliato nico (non mi veniva il nome, non dormo da 36 ore, le mie capacità cognitive sono leggermente ridotte).

nico159
15-05-2010, 00:58
Te l'avevo suggerito dall'inizio il modulo commands, pensavo che lo avessi almeno guardato. Poi c'è anche subprocess come ha consigliato nico (non mi veniva il nome, non dormo da 36 ore, le mie capacità cognitive sono leggermente ridotte).
Sì attualmente c'è molto caos al riguardo, fortuna che con Python3 è stata fatta pulizia

cdimauro
15-05-2010, 07:02
subprocess è la soluzione giusta. commands è deprecato da un po'.

P.S. Lunga vita a Python 3. :D

Ryuzaki_Eru
15-05-2010, 12:32
Sì attualmente c'è molto caos al riguardo, fortuna che con Python3 è stata fatta pulizia

Come non quotare.

subprocess è la soluzione giusta. commands è deprecato da un po'.

Però viene ancora usato da molti.

P.S. Lunga vita a Python 3

Ma come è messa la situazione?

cdimauro
15-05-2010, 21:21
Però viene ancora usato da molti.
Spero non per codice nuovo, visto che è scritto a chiare lettere che è deprecato.
Ma come è messa la situazione?
Te lo dirò dopo che avrò creato un branch della 3.2, ma ci vorrà un po' di tempo (ho altro da fare, al momento).

Ryuzaki_Eru
15-05-2010, 21:38
Alcuni lo usano per progetti nuovi, purtroppo.

cdimauro
15-05-2010, 22:28
http://ermopoli.it/portale/images/Ermopoli/smilies/frusta.gif

Ryuzaki_Eru
15-05-2010, 22:50
Fosse solo quello :muro: