2012-11-20 37 views
7

मैं एक जावा प्रोग्राम लिखने की कोशिश कर रहा हूं जो प्रोग्राम "tesseract" के उदाहरण को चलाने के लिए कमांड लाइन का उपयोग करने के लिए Runtime.getRuntime().exec() विधि का उपयोग करता है।जावा getRuntime()। Exec() को तर्क के साथ कमांड लाइन प्रोग्राम चलाने के लिए कैसे प्राप्त करें?

कुछ पृष्ठभूमि, टेस्सेक्ट एक मुक्त ओपन सोर्स प्रोग्राम है जिसका उपयोग चित्रों पर ओसीआर (ऑप्टिकल कैरेक्टर रिकग्निशन) करने के लिए किया जाता है। यह एक तस्वीर फ़ाइल लेता है और एक पाठ दस्तावेज़ outputs। यह एक कमांड लाइन कार्यक्रम इस आदेश का उपयोग करता है (कमांड प्रॉम्प्ट खोल के भीतर से)

चलाने के लिए है

tesseract imageFilePath outFilePath [optional arguments] 

उदाहरण:

tesseract "C:\Program Files (x86)\Tesseract-OCR\doc\eurotext.tif" "C:\Users\Dreadnought\Documents\TestingFolder\out" 

पहला तर्क कहता है Tesseract कार्यक्रम, दूसरा छवि फ़ाइल का पूर्ण पथ है और अंतिम तर्क पथ फ़ाइल और आउटपुट फ़ाइल का नाम होना चाहिए। टेसेरएक्ट को केवल आउटपुट फ़ाइल का नाम चाहिए जिसके लिए उसे एक्सटेंशन की आवश्यकता नहीं है।

कमांड प्रॉम्प्ट से कार्य करना यह सही काम करता है। हालांकि, मैं इसे जावा प्रोग्राम से चलाने के लिए चाहता था और कुछ त्रुटियों में चल रहा था।

मैं एक बिंदु

public class Main 
{ 
    public static void main(String args[]) 
    { 
     try 
     { 
     Runtime rt = Runtime.getRuntime(); 
     String cmdString = "cmd /c dir"; 

     System.out.println(cmdString); 
     Process pr = rt.exec(cmdString); 

     BufferedReader input = new BufferedReader(new InputStreamReader(
                pr.getInputStream())); 

     String line = null; 

     while ((line = input.readLine()) != null) 
     { 
      System.out.println(line); 
     } 

     int exitVal = pr.waitFor(); 
     System.out.println("Exited with error code " + exitVal); 

     } 
     catch (Exception e) 
     { 
     System.out.println(e.toString()); 
     e.printStackTrace(); 
     } 
    } 
} 

की शुरुआत के रूप में यह dir कमांड का परिणाम बाहर प्रिंट इस इस कोड को बहुत उपयोगी हो पाया। लेकिन जब मैं यह इतना

public class Main 
{ 
    public static void main(String args[]) 
    { 
     try 
     { 
     Runtime rt = Runtime.getRuntime(); 
     String imageFilePath = "\"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\""; 
     String outputFilePath = "\"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\""; 
     String[] commands = {"cmd", "/c", "tesseract", imageFilePath, outputFilePath }; 

     Process pr = rt.exec(commands); 

     BufferedReader input = new BufferedReader(new InputStreamReader(
       pr.getInputStream())); 

     String line = null; 

     while ((line = input.readLine()) != null) 
     { 
      System.out.println(line); 
     } 

     int exitVal = pr.waitFor(); 
     System.out.println("Exited with error code " + exitVal); 
     } 
     catch (Exception e) 
     { 
     System.out.println(e.toString()); 
     e.printStackTrace(); 
     } 
    } 
} 

तरह संशोधित केवल एक चीज यह आउटपुट Exited with error code 1 है। प्रक्रिया एक त्रुटि के साथ समाप्त होने पर अपेक्षित आउटपुट है।

मैंने "cmd /c tesseract \"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\" \"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"" पास करने का भी प्रयास किया है और मुझे एक ही त्रुटि हो रही है।

Using Quotes within getRuntime().exec के अनुसार मैंने सोचा कि समस्या यह थी कि मैं उद्धरण से बचने की कोशिश कर रहा था, इसलिए मैं स्ट्रिंग सरणी में पारित हुआ। लेकिन मुझे अभी भी Exited with error code 1 मिल रहा है।

क्या जावा Runtime.getRuntime().exec() कमांड के साथ एक कमांड लाइन प्रोग्राम निष्पादित करना संभव है?


संपादित: समस्या अभी भी

मैं का उपयोग नहीं "cmd/ग" तर्क का एक ही रेखा के साथ सोच के रूप में एव्गेनि Dorofeev और नंदकुमार Tekale नीचे का सुझाव दिया की कोशिश की है उत्पन्न कर रहा है। हालांकि, मुझे एक अलग प्रकार की त्रुटि मिलती है:

java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system cannot find the file specified 
java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at Main.main(Main.java:15) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
... 4 more 

शायद यह अधिक जानकारी देता है? मैं इस समस्या का कारण बनने के बारे में वास्तव में उत्सुक हूं। इसके अलावा समस्या यह वही है कि मैं अपने तर्कों से बच निकले उद्धरण जोड़ता हूं या नहीं।


संपादित 2: एक लहर पर मैं Tesseract निष्पादन के लिए एक निरपेक्ष पथ प्रदान की है और cmd /c का उपयोग नहीं कर एक आकर्षण की तरह काम किया। मुझे लगता है कि सवाल Runtime.getRuntime().exec() पर्यावरण चर कॉल नहीं कर सकता है?

+0

मुझे यकीन है कि नहीं कर रहा हूँ लेकिन समस्या के साथ मौजूद हो सकता है' सी: \\ प्रोग्राम फ़ाइलें (x86) 'जिसमें पथ में स्थान होता है। –

+0

मुझे लगा कि यह समस्या की जड़ थी इसलिए मैंने उद्धरणों का उपयोग करने की कोशिश की, लेकिन अगर वे नहीं हैं निष्पादन के साथ आरके, क्या आपके पास यह सुझाव है कि मैं यह काम कैसे कर सकता हूं? – Samuel

+0

आप 'rt.exec() 'के लिए एक सरणी गुजर रहे हैं। अपने तर्कों की शुरुआत और अंत में उद्धरण न दें। यह तर्कों को अलग करने के तरीके पर खोल के लिए एक जानकारी है, लेकिन आप इसे पहले से ही कर चुके हैं। –

उत्तर

1

अच्छी तरह से tesseract बाहरी कमांड है इसलिए आपको इसे cmd के साथ उपयोग करने की आवश्यकता नहीं है। पर्यावरण चर के लिए tesseract जोड़ें। प्रत्यक्ष आदेश का उपयोग करें:

String[] commands = {"tesseract", imageFilePath, outputFilePath }; 

अस्तित्व स्थिति 1 का मतलब गलत कार्य है। देखें process exit status

+0

tesseract पहले से ही पर्यावरण चर में है। – Samuel

+0

क्या आपने सीधे cmd प्रॉम्प्ट पर इसे चलाने की जांच की? –

+0

हाँ, यह कमांड प्रॉम्प्ट से ठीक काम करता है – Samuel

0

पुन: संकलित और तैनाती किए बिना एक और कामकाज पुराने 0 डीके लिए पुराने डॉस शैली पथ का उपयोग कर रहा है C:\Progra~1 होगा। बेशक यह केवल तभी मददगार होगा जब आप कॉन्फ़िगरेशन फ़ाइल या डीबी और रजिस्ट्री इत्यादि से पथ पढ़ रहे हों।

0

कोई अन्य कार्यवाही फ़ाइल के पूर्ण स्थापना पथ को /usr/local/Cellar/tesseract/3.02.02/ bin/Tesseract "

0

आप STDERR कब्जा नहीं कर रहे हैं, इसलिए जब त्रुटियां होती हैं आप STDOUT (जो आप पर कब्जा कर रहे हैं) से उन्हें प्राप्त नहीं होता है का प्रयास करें:।

BufferedReader input = new BufferedReader(new InputStreamReader(
       pr.getErrorStream())); 

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

  • कोई संबंधित समस्या नहीं^_^