2013-05-08 8 views
10

मैं लिनक्स निष्पादित कर सकते हैं समस्याओं के बिना ls या pwd जावा से की तरह आदेशों लेकिन Python स्क्रिप्ट निष्पादित नहीं मिल सकता है।जावा से पायथन स्क्रिप्ट निष्पादित करने के लिए कैसे?

यह मेरा कोड है:

Process p; 
try{ 
    System.out.println("SEND"); 
    String cmd = "/bash/bin -c echo password| python script.py '" + packet.toString() + "'"; 
    //System.out.println(cmd); 
    p = Runtime.getRuntime().exec(cmd); 
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String s = br.readLine(); 
    System.out.println(s); 
    System.out.println("Sent"); 
    p.waitFor(); 
    p.destroy(); 
} catch (Exception e) {} 

कुछ भी नहीं हुआ। इसे भेजने पर पहुंच गया, लेकिन यह सिर्फ यह बाद बंद कर दिया ...

मैं एक स्क्रिप्ट जो रूट अनुमतियों की आवश्यकता है क्योंकि यह सीरियल पोर्ट का उपयोग करता है निष्पादित करने के लिए कोशिश कर रहा हूँ। इसके अलावा, मुझे कुछ पैरामीटर (पैकेट) के साथ एक स्ट्रिंग पास करनी है।

+0

यह करने के लिए अपने अजगर पटकथा लेखन somethong बाहर मानक है है? – VishalDevgire

+0

अपाचे कॉमन्स निष्पादन का उपयोग करने के बारे में क्या? – rkosegi

उत्तर

14

आप Runtime.getRuntime().exec() अंदर पाइप उपयोग नहीं कर सकते जैसा कि आप अपने उदाहरण में करते हैं। पीआईपीई खोल का हिस्सा है।

आप या तो

  • एक खोल स्क्रिप्ट को अपने आदेश रखो और साथ कि खोल स्क्रिप्ट निष्पादित कर सकता है .exec() या
  • आप निम्न

    String[] cmd = { 
         "/bin/bash", 
         "-c", 
         "echo password | python script.py '" + packet.toString() + "'" 
        }; 
    Runtime.getRuntime().exec(cmd); 
    
+0

इसके लिए मैं एक शैल स्क्रिप्ट कैसे करूं? मैंने कभी भी शेल स्क्रिप्ट नहीं बनाई है – Biribu

+2

यह उत्तर शैल स्क्रिप्ट फ़ाइल बनाने के बिना भी काम करता है। बस इसे अपने कोड पर कॉपी करें। – pts

+0

@pts हाँ, यह काम करता है लेकिन मैं इसे पहले स्पष्ट रूप से समझा नहीं सकता था। मैंने पोस्ट अपडेट किया, मुझे उम्मीद है कि यह अब बेहतर होगा। – Alper

12
के लिए इसी तरह कुछ कर सकते हैं

@ अल्पर का जवाब काम करना चाहिए। बेहतर अभी तक, हालांकि, एक शेल स्क्रिप्ट और पुनर्निर्देशन का उपयोग न करें। आप प्रक्रिया 'के लिए stdin (भ्रमित करने वाले नाम) Process.getOutputStream() का उपयोग कर सीधे पासवर्ड लिख सकते हैं।

Process p = Runtime.exec(
    new String[]{"python", "script.py", packet.toString()}); 

BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(p.getOutputStream())); 

writer.write("password"); 
writer.newLine(); 
writer.close(); 
+0

क्या यह विंडोज़ के साथ-साथ लिनक्स के साथ काम करने जा रहा है? –

+1

@ChinmayaB - हाँ, यह ओएस अज्ञेयवादी है। – jtahlborn

7

आप बदतर embedding jython कोशिश करते हैं और अपनी स्क्रिप्ट लागू करने के लिए की तुलना में करना होगा। एक साधारण उदाहरण में मदद करनी चाहिए:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("python"); 

// Using the eval() method on the engine causes a direct 
// interpretataion and execution of the code string passed into it 
engine.eval("import sys"); 
engine.eval("print sys"); 

यदि आपको और सहायता चाहिए, तो एक टिप्पणी छोड़ दें। यह एक अतिरिक्त प्रक्रिया नहीं बनाता है।

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

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