2012-12-19 14 views
5

Łączę mały skrypt MATLAB z Pythonem za pomocą modułu subprocess. W następujący sposób:Python nie czeka na zakończenie MATLABA

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?" 

Ale "DONE" jest drukowane jeszcze przed rozpoczęciem MATLAB! Cały mój kod, który przeszedł, zrywa się z tego powodu.

Próbowałem:

  • Korzystanie os.system() zwraca (To gdzie zacząłem, ale czytałem na SO, że jego przestarzałe)
  • Korzystanie p.wait() i subprocess.Popen.wait. Oba nie działają.
  • Korzystanie z pauzy ręcznej trwającej 3 minuty (Maksymalny czas pracy MATLAB kończy się średnio) Super Sloppy.

Czego mi brakuje?

+0

Miałem podobną rzecz na stronie ASP.NET MVC podczas próby wywołania MATLAB. Czy korzystasz z jakiejś określonej funkcji w MATLAB, czy po prostu chcesz ją włączyć? – IronMan84

+0

@ IronMan84 Nie mogę uzyskać kodu matematycznego działającego w NumPy, więc eksportuję moje macierze do pliku csv, odczytuję go w MATLAB, obliczam i eksportuję odpowiedź do pliku csv i odczytywam z powrotem w Pythonie. –

+0

Co się stanie, jeśli usuniesz nawias? – mgilson

Odpowiedz

4

działa dobrze dla mnie:

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

Podział polecenie argumenty odpowiednio, należy używać tylko opcje, które faktycznie wymagają (nie ma potrzeby shell=True, na przykład), należy użyć funkcji, które bezpośrednio nie to, czego po (call), tzn. Zadzwoń i czekaj na zakończenie.

W zależności od instalacji (patrz http://www.mathworks.com/help/matlab/ref/matlabwindows.html), Matlab może zostać uruchomiony w taki sposób, że natychmiast wychodzi. Aby sobie z tym poradzić, dodaj "-wait" do listy argumentów.

+0

Nie. Żadne z tych rozwiązań nie zadziałało. Jak wspomniałem w drugiej odpowiedzi, mam nieskończoną próbę, z wyjątkiem pętli i nadal jest ona w pętli wyjątkowej. –

+0

Wprowadzanie "pętli z wyjątkiem"? Co to jest ? Zakładam, że chodziło ci o coś w formie z wyjątkiem bloku, a potem wydaje się, że masz jakiś błąd przy uruchamianiu programu matlab. – mmgp

+0

Nie, miałem na myśli. Mam coś takiego: spróbuj: polecenie matlab. oprócz: spać przez 1s i kontynuować. Bez względu na to, co robię, ciągle wchodzi do bloku z wyjątkiem. –

0

Na podstawie odpowiedzi na mój komentarz, pozwól mi odpowiedzieć na pytanie, co zrobiłem dla mojego wniosku, który miał podobny proces do twojego (choć w C#). Zamiast próbować zmusić proces do oczekiwania na zakończenie MATLAB (co oczywiście nie działa teraz), po prostu poczekaj na zapisanie pliku CSV. Jeśli martwisz się, że możesz mieć duplikaty, to po prostu dołącz bieżącą datę i godzinę do końca pliku, co powinno wystarczyć.

+0

Oto moje rozwiązanie. Nieskończona pętla czeka na pojawienie się pliku. –

4

Start Matlab z flagą "-wait". Z dokumentacji:

"Program MATLAB jest uruchamiany przez oddzielny program startowy, który normalnie uruchamia program MATLAB, a następnie natychmiast kończy działanie .Za pomocą tej opcji program rozrusznika nie jest zamykany, dopóki program MATLAB nie zakończy pracy. Ta opcja jest przydatna, gdy trzeba przetworzyć wyniki z MATLAB w skrypcie Wywołanie MATLAB z tą opcją blokuje kontynuowanie skryptu aż do wygenerowania wyników. "

Powiązane problemy