2010-10-29 17 views
5

मेरे पास यह जावा एप्लिकेशन है और एसटीडीएफ को पार्स करने के लिए एक आवश्यकता में भाग गया।जावा से एक अजगर लिपि कैसे चलाएं?

असल में सब मैं जरूरत एक stdf फ़ाइल के सुदूर, मीर और एमआरआर वर्गों प्राप्त करने के लिए है। Sourceforge पर stdf4j मौजूद है लेकिन मैं इसका उपयोग दस्तावेज़ीकरण की कमी के कारण इतना नहीं कर सकता।

संकल्प stdfparser का उपयोग करना था जो कि अजगर में लिखा गया है और अपेक्षाकृत अधिक सरल है और नौकरी को आसान बनाता है, वास्तव में मैं पहले से ही अपनी आवश्यकताओं के अनुरूप संशोधित हूं।

तो अब मैं सिर्फ verbosely इस स्क्रिप्ट आह्वान और जावा में परिणामी फ़ाइल पढ़ सकते हैं और मौजूदा आवेदन के साथ आगे बढ़ने की जरूरत है।

समस्या का उपयोग करते समय है:

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

परिणामी पाठ फ़ाइल हमेशा खाली है। (ध्यान दें कि मैं पहले से ही वास्तविक कमांड लाइन पर इस भाग गया और सफलतापूर्वक सामग्री मैं जरूरत लिया गया।)

क्या मैं बाहर याद कर रहा हूँ, या वहाँ किसी भी बेहतर विकल्प हो रहा है। (मैं Jython से बचने के लिए के रूप में मैं यह उत्पादन वातावरण पर जार है स्थापित नहीं कर सकता कोशिश कर रहा हूँ।)

+0

विंडोज वातावरण में, निष्पादन योग्य के पथ को स्पष्ट रूप से घोषित किया जाना चाहिए कि: प्रक्रिया पी = r.exec ("सी: /WINDOWS/system32/cmd.exe/c python parser.py sample_data.std.gz> परीक्षण ।टेक्स्ट"); – lock

उत्तर

6

आपको शायद p.waitFor(); पर कॉल करना चाहिए ताकि बाहरी प्रक्रिया निष्पादित होने के बाद तक आपका जावा प्रोग्राम आगे नहीं बढ़ता।

अद्यतन 1: यह भी सुनिश्चित करें कि आप p.getErrorStream() और p.getInputStream() से बाहर सभी बाइट्स पढ़ रहे हैं। ऐसा करने में विफलता प्रक्रिया को लटका सकती है।

अद्यतन 2: तुम भी एक त्रुटि कोड के लिए प्रक्रिया वापसी कोड की जांच कर सकते हैं। प्रक्रिया वापसी कोड waitFor() के वापसी मूल्य के माध्यम से उपयोग किया जाता है।

+0

वास्तव में उस कोड के बाद अगली पंक्ति, मैंने इसे भ्रम से बचने के लिए शामिल नहीं किया है, लेकिन मुझे लगता है कि यह अन्यथा किया गया था: पी – lock

+1

ठीक है, अगला सुनिश्चित करें कि आप सभी बाइट्स को निकाल रहे हैं p.getErrorStream() और p.getInputStream()। साथ ही, क्या यह संभव है कि "पायथन" को चलाने के बजाय "cmd/c python" का उपयोग करके, समस्या हो सकती है? –

0

एक cmd फ़ाइल बनाने का प्रयास करें और फिर फोन है कि जावा का उपयोग कर।

+0

ऐसा करने के बेहतर तरीके हैं। माइक क्लार्क के जवाब का संदर्भ लें ~ _ ~ – rana

2

यह सुनिश्चित करने के अलावा कि आप p.waitFor() पर कॉल करें, आपको भी स्ट्रीम की सामग्री को पढ़ना पड़ सकता है। यदि धाराएं पढ़ी नहीं जाती हैं, तो प्रक्रियाएं रुक जाएंगी।

कोशिश इस वर्ग को जोड़ने: http://www.physionet.org/physiotools/puka/sourceCode/puka/StreamGobbler.java

और यह बुला:

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

आप अपने दम पर एक अधिक कुशल वर्ग के साथ आने के लिए सक्षम हो सकता है, लेकिन यह है कि एक कम से कम आप देना चाहिए मूल विचार (ध्यान दें कि यह मेरे द्वारा नहीं लिखा गया था)।

संबंधित मुद्दे