2012-12-19 41 views
5

Tôi đang giao tiếp một tập lệnh MATLAB nhỏ với Python thông qua mô-đun subprocess. Như sau:Python Không đợi MATLAB kết thúc

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

Nhưng "DONE" đang được in ngay cả trước khi MATLAB bắt đầu! Toàn bộ mã của tôi qua nó đang phá vỡ vì điều này.

Tôi đã thử:

  • Sử dụng os.system() gọi (Đây là nơi tôi bắt đầu, nhưng tôi đọc về SO mà bị phản đối của nó)
  • Sử dụng p.wait()subprocess.Popen.wait. Cả hai đều không hoạt động.
  • Sử dụng tạm dừng thủ công 3 phút (Thời gian tối đa MATLAB cần hoàn thành trung bình) Siêu Sloppy.

Tôi đang thiếu gì?

+0

Tôi đã có một điều tương tự xảy ra trong trang ASP.NET MVC của tôi khi cố gắng gọi MATLAB. Bạn đang chạy bất kỳ chức năng cụ thể trong MATLAB, hoặc bạn chỉ muốn bật nó? – IronMan84

+0

@ IronMan84 Tôi không thể nhận được một mã toán học trong NumPy vì vậy tôi đang xuất các ma trận của mình sang tệp csv, đọc nó trong MATLAB, tính toán và xuất câu trả lời cho tệp csv và đọc nó trong Python. –

+0

Điều gì sẽ xảy ra nếu bạn xóa dấu ngoặc đơn? – mgilson

Trả lời

4

trình tốt cho tôi:

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

Chia lệnh đối số cho phù hợp, chỉ sử dụng tùy chọn mà bạn thực sự yêu cầu (không cần shell=True, ví dụ), sử dụng chức năng trực tiếp làm những gì bạn đang sau (call), tức là, gọi và chờ hoàn thành.

Tùy thuộc vào cài đặt của bạn (xem http://www.mathworks.com/help/matlab/ref/matlabwindows.html), Matlab có thể được khởi chạy theo cách thoát ngay lập tức. Để xử lý điều đó, hãy thêm "-wait" vào danh sách đối số của bạn.

+0

Không. Cả hai giải pháp đều không hoạt động. Như tôi đã đề cập trong câu trả lời khác, tôi có một thử nghiệm vô hạn, ngoại trừ vòng lặp và nó vẫn đang bước vào vòng lặp ngoại trừ. –

+0

Nhập "trừ vòng lặp"? Đó là gì ? Tôi giả sử bạn có nghĩa là một cái gì đó trong các hình thức ngoại trừ khối, và sau đó có vẻ như bạn có một số lỗi bắt đầu MATLAB sau đó. – mmgp

+0

Không, ý tôi là. Tôi có một cái gì đó như thế này: thử: lệnh MATLAB. ngoại trừ: ngủ trong 1 giây và tiếp tục. Bất kể tôi làm gì, nó vẫn đi vào khối ngoại trừ. –

0

Dựa trên câu trả lời của bạn cho nhận xét của tôi, hãy để tôi trả lời câu hỏi của bạn với những gì tôi đã làm cho đơn đăng ký của tôi, có quá trình tương tự với bạn (mặc dù trong C#). Thay vì cố gắng ép buộc quá trình của bạn chờ MATLAB kết thúc (rõ ràng là không hoạt động ngay bây giờ), chỉ cần đợi tệp CSV đó được ghi vào. Nếu bạn đang lo lắng về việc có thể có bản sao, thì chỉ cần thêm ngày và thời gian hiện tại vào cuối tệp và điều đó sẽ thực hiện thủ thuật.

+0

Đó là giải pháp của tôi ngay bây giờ. Vòng lặp vô hạn chờ tệp xuất hiện. –

4

Bắt đầu Matlab bằng cờ "chờ". Từ documenation:

"MATLAB được bắt đầu bằng một chương trình khởi động riêng biệt mà thường khởi chạy MATLAB và sau đó thoát ngay lập tức. Sử dụng tùy chọn này cho chương trình khởi động không thoát cho đến khi MATLAB chấm dứt. Tùy chọn này rất hữu ích khi bạn cần xử lý kết quả từ MATLAB trong một kịch bản. Gọi MATLAB với tùy chọn này sẽ chặn tập lệnh tiếp tục cho đến khi kết quả được tạo. "

Các vấn đề liên quan