2010-10-29 34 views
5

Tôi có ứng dụng java này và chạy vào một yêu cầu để phân tích cú pháp STDF.Làm thế nào để chạy một kịch bản python từ java?

Thực ra tất cả những gì tôi cần là lấy các phần FAR, MIR và MRR của tệp stdf. Có tồn tại một stdf4j trên sourceforge nhưng tôi không thể sử dụng nó nhiều do thiếu tài liệu.

Giải pháp là sử dụng trình viết tắt được viết bằng python và tương đối đơn giản hơn và hoàn thành công việc dễ dàng hơn, thực tế tôi đã sửa đổi cho phù hợp với nhu cầu của mình.

Vì vậy, bây giờ tôi chỉ cần gọi tập lệnh này một cách chi tiết và đọc tệp kết quả trong Java và tiếp tục với ứng dụng hiện có.

Vấn đề là khi sử dụng:

Process p = r.exec("cmd /c python parser.py sample_data.std.gz -v test.txt"); 

kết quả tập tin văn bản luôn luôn trống. (Lưu ý rằng tôi đã chạy điều này trên dòng lệnh thực tế và đã truy xuất thành công nội dung tôi cần.)

Có bất kỳ điều gì tôi thiếu hoặc có bất kỳ lựa chọn thay thế nào tốt hơn không. (Tôi đang cố gắng tránh jython vì tôi không thể cài đặt nó trên môi trường sản xuất.)

+0

trong môi trường cửa sổ, đường dẫn đến tệp thực thi phải được khai báo rõ ràng như sau: Quy trình p = r.exec ("C: /WINDOWS/system32/cmd.exe/c python parser.py sample_data.std.gz> kiểm tra .txt "); – lock

Trả lời

6

Bạn có lẽ nên gọi p.waitFor(); để chương trình Java của bạn không di chuyển cho đến sau khi quá trình bên ngoài hoàn tất việc thực thi.

Cập nhật 1: Đồng thời đảm bảo bạn đang đọc tất cả các byte trong số p.getErrorStream()p.getInputStream(). Việc không làm như vậy có thể treo quá trình.

Cập nhật 2: Bạn cũng có thể muốn kiểm tra mã trả về quy trình cho mã lỗi. Mã trả về quá trình được truy cập thông qua giá trị trả về của waitFor().

+0

thực sự là dòng tiếp theo sau mã đó, tôi không bao gồm nó để tránh nhầm lẫn nhưng tôi đoán nó đã làm khác: P – lock

+1

OK, tiếp theo hãy chắc chắn rằng bạn đang thoát tất cả các byte ra khỏi p.getErrorStream() và p.getInputStream(). Ngoài ra, có thể sử dụng "python cmd/c" thay vì chỉ chạy "python" trực tiếp, có thể gây ra sự cố không? –

0

Thử tạo một tệp cmd và sau đó gọi bằng cách sử dụng Java.

+0

Có nhiều cách tốt hơn để thực hiện việc này. Tham khảo câu trả lời của Mike Clark ~ _ ~ – rana

2

Ngoài việc đảm bảo bạn gọi số p.waitFor(), bạn cũng có thể phải đọc nội dung của các luồng. Nếu các luồng không được đọc, các quá trình sẽ bị ngừng.

Hãy thử thêm lớp này: http://www.physionet.org/physiotools/puka/sourceCode/puka/StreamGobbler.java

Và gọi đó là:

new StreamGobbler(p.getErrorStream(), "Error"); 
new StreamGobbler(p.getInputStream(), "Input"); 

Bạn có thể có thể đưa ra một lớp học hiệu quả hơn trên của riêng bạn, nhưng điều đó một ít nhất nên cung cấp cho bạn ý tưởng cơ bản (lưu ý rằng nó không được viết bởi tôi).

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