2013-01-21 19 views
5

के साथ अजगर का उपयोग करना मैं अजगर के साथ उपप्रोसेसेस का उपयोग करने के लिए संघर्ष कर रहा हूं। यहाँ मेरी काम है:सबप्रोसेस पॉपन

  1. कमांड लाइन के माध्यम से एक API शुरू (इस कमांड लाइन पर किसी भी तर्क से चल रहा है से अलग नहीं होना चाहिए)
  2. सत्यापित करें मेरी एपीआई आ गया है। ऐसा करने का सबसे आसान तरीका मानक आउटपुट करना होगा।
  3. एपीआई के खिलाफ एक आदेश चलाएं। एक कमांड प्रॉम्प्ट प्रकट होता है जब मैं एक नया आदेश
  4. चलाने के लिए आदेश कम्प्लिट्स मानक बाहर (एपीआई प्रवेश का समर्थन नहीं करता)

पोलिंग के द्वारा सत्यापित करें मैं अब तक क्या प्रयास किया है में सक्षम हूँ:
1 मैं Popen का उपयोग कर यहाँ अटक गया हूँ। मैं समझता हूं कि अगर मैं subprocess.call("put command here") का उपयोग करता हूं तो यह काम करता है। मैं करने के लिए कुछ इसी तरह इस्तेमाल करने की कोशिश करना चाहता था:

import subprocess 

def run_command(command): 
    p = subprocess.Popen(command, shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 

जहाँ मैं run_command("insert command here") का उपयोग, लेकिन यह कुछ नहीं करता है।

2. के संबंध में मुझे लगता है कि इस सवाल का जवाब यहाँ के समान होना चाहिए: Running shell command from Python and capturing the output, लेकिन जैसा कि मैंने 1. काम करने के लिए नहीं मिल सकता है, मुझे लगता है कि अभी तक प्रयास नहीं किया है।

उत्तर

7

कम से कम वास्तव में उपप्रोसेस शुरू करने के लिए, आपको वास्तव में संवाद करने के लिए पॉपन-ऑब्जेक्ट को बताना होगा।

def run_command(command): 
    p = subprocess.Popen(command, shell=True, 
      stdout=subprocess.PIPE, 
      stderr=subprocess.STDOUT) 
    return p.communicate() 
6

आप Pexpect पर गौर कर सकते, एक मॉड्यूल विशेष रूप से खोल आधारित प्रोग्राम के साथ बातचीत के लिए तैयार किया गया है।

उदाहरण के लिए एक SCP आदेश की शुरूआत और पासवर्ड के लिए आपको बस इतना संकेत इंतजार कर:

child = pexpect.spawn('scp foo [email protected]:.') 
child.expect ('Password:') 
child.sendline (mypassword) 

एक अजगर 3 संस्करण के लिए Pexpect-u देखें।

+2

बस इसे जोड़ने के लिए, AFAICT, उपप्रोसेसर मॉड्यूल वास्तव में उन कार्यों के लिए तैयार है जो उनके प्रारंभिक इनपुट के साथ चलते हैं और फिर पूरा करते हैं (जैसे किसी फ़ंक्शन पर कॉल करना)। यदि आपको आगे और पीछे की आवश्यकता है (उदा। इंटरैक्टिव टर्मिनल उपयोगिता के लिए) तो Pexpect * निश्चित रूप से * जाने का तरीका है। – TimStaley

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