2012-12-19 32 views
5

Interagisco un piccolo script MATLAB con Python tramite il modulo subprocess. Come segue:Python non aspetta MATLAB per terminare

cmd='(matlab -nosplash -nodesktop -r "optimizer;quit;")' 
p = subprocess.Popen(cmd,stdin=None,stdout=None,shell=True) 
#subprocess.Popen.wait(p) 
#p.wait() 
print "DONE?" 

Ma "DONE" è in fase di stampa anche prima dell'inizio di MATLAB! A causa di ciò, il mio intero codice non funziona più.

ho provato:

  • Utilizzando os.system() chiama (Questo è dove ho iniziato, ma ho letto su SO che la sua deprecato)
  • Utilizzando p.wait() e subprocess.Popen.wait. Entrambi non funzionano.
  • Utilizzo di una pausa manuale di 3 minuti (tempo massimo che MATLAB impiega a terminare in media) Super Sloppy.

Cosa mi manca?

+0

Ho avuto una cosa simile nella mia pagina ASP.NET MVC durante il tentativo di chiamare MATLAB. Stai eseguendo una funzione specifica in MATLAB o vuoi semplicemente accenderla? – IronMan84

+0

@ IronMan84 Non riesco a far funzionare un codice matematico in NumPy, quindi esporto le mie matrici in un file csv, lo leggo in MATLAB, calcolo ed esportazione della risposta in un file csv e rilettura in Python. –

+0

Cosa succede se si rimuove la parentesi? – mgilson

risposta

4

funziona bene per me:

import subprocess 
retcode = subprocess.call(["matlab", "-nosplash", "-nodesktop", "-r", "quit;"]) 
print "DONE", retcode 

Spalato il comando argomenti di conseguenza, utilizzare solo le opzioni che effettivamente necessari (senza bisogno di shell=True, per esempio), utilizzare la funzione che fa direttamente che cosa siete dopo (call), ovvero, chiama e attendi il completamento.

A seconda dell'installazione (vedere http://www.mathworks.com/help/matlab/ref/matlabwindows.html), Matlab può essere avviato in modo tale da uscire immediatamente. Per gestirlo, aggiungi "-wait" alla tua lista di argomenti.

+0

No. Nessuna delle due soluzioni ha funzionato. Come ho accennato nell'altra risposta, ho una prova infinita, ad eccezione del ciclo e sta ancora entrando nel ciclo eccetto. –

+0

Immissione del "ciclo eccetto"? Cos'è quello ? Immagino tu intenda qualcosa sotto forma di blocco tranne, e poi sembra che tu abbia qualche errore a partire da matlab allora. – mmgp

+0

No, intendevo. Ho qualcosa di simile: provare: comando matlab. eccetto: sleep per 1s e continua. Non importa quello che faccio, continua a entrare nel blocco eccetto. –

0

Sulla base della risposta al mio commento, consentitemi di rispondere alla domanda con quello che ho fatto per la mia applicazione, che ha avuto un processo simile al vostro (anche se in C#). Invece di provare a forzare il tuo processo ad aspettare che MATLAB finisca (che ovviamente non sta funzionando in questo momento), aspetta solo che il file CSV venga scritto. Se sei preoccupato di possedere dei duplicati, aggiungi semplicemente la data e l'ora corrente alla fine del file, e questo dovrebbe fare la differenza.

+0

Questa è la mia soluzione adesso. Ciclo infinito in attesa che il file appaia. –

4

Avviare Matlab con il flag "-wait". Dalla documentazione:

"MATLAB viene avviato da un programma di avviamento separato che normalmente avvia MATLAB e quindi si chiude immediatamente.Usando questa opzione dice al programma di avviamento di non uscire finché MATLAB non viene terminato.Questa opzione è utile quando è necessario elaborare i risultati di MATLAB in uno script. Chiamare MATLAB con questa opzione impedisce allo script di continuare fino a quando i risultati non vengono generati. "

Problemi correlati