2012-02-17 17 views
8

यदि मैं किसी दिए गए कमांड के साथ पाइथन में एक नया subprocess स्पॉन करता हूं (मान लीजिए कि मैं python कमांड के साथ पाइथन दुभाषिया शुरू करता हूं), मैं प्रक्रिया (एसटीडीआईएन के माध्यम से) में नया डेटा कैसे भेज सकता हूं?एक उपप्रजाति को जीवित रखें और इसे आज्ञाएं दें? पायथन

+1

अगर यह एक खोल आप के साथ बातचीत को स्वचालित करना चाहते है 'pexpect' बात इस तरह की लिए अच्छा है। – wim

उत्तर

8

मानक subprocess मॉड्यूल का उपयोग करें। आप प्रक्रिया शुरू करने के लिए subprocess.Popen() का उपयोग करते हैं, और यह पृष्ठभूमि में चलाएगा (यानी आपके पायथन प्रोग्राम के साथ ही)। जब आप Popen() को कॉल करते हैं, तो आप शायद stprin, stdout और stderr पैरामीटर को subprocess.PIPE पर सेट करना चाहते हैं। फिर आप डेटा को लिखने और पढ़ने के लिए लौटे ऑब्जेक्ट पर stdin, stdout और stderr फ़ील्ड का उपयोग कर सकते हैं।

Untested उदाहरण कोड:

from subprocess import Popen, PIPE 

# Run "cat", which is a simple Linux program that prints it's input. 
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE) 
process.stdin.write(b'Hello\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'Hello\n' 
process.stdin.write(b'World\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'World\n' 

# "cat" will exit when you close stdin. (Not all programs do this!) 
process.stdin.close() 
print('Waiting for cat to exit') 
process.wait() 
print('cat finished with return code %d' % process.returncode) 
+0

तो मान लें कि मुझे एक साथ चलने वाली कई प्रक्रियाओं की आवश्यकता है। क्या 'पोपेन()', या 'कांटा' के साथ बहुत से उपप्रोसेसरों को फैलाना बेहतर विचार है? – n0pe

+1

Popen प्रक्रियाओं कांटा करता है। यह केवल एक प्रश्न है कि आप निम्न स्तर का कांटा खुद करना चाहते हैं या आप इसे उच्च स्तर की लाइब्रेरी में लपेटना चाहते हैं। अंतिम परिणाम बिल्कुल वही है। –

+0

तो कई समवर्ती पॉपेंस सिस्टम को बंद नहीं करेंगे? धन्यवाद, मैं इसे आज़मा दूंगा। – n0pe

0

एक कई आदेशों आग उपप्रक्रिया द्वारा बनाई गई सुरंग जीवित नहीं रखा जा सकता है। यह आप उपप्रक्रिया stdin, stdout जैसे अन्य सामान के लिए, paramiko पर गौर कर सकते प्राप्त करने के लिए, stderr आप इस लिंक के माध्यम से python subprocess है, क्योंकि यह आपकी पहली अजगर परियोजना है जा सकते हैं यह है बेहतर आप पढ़ सकते हैं और सामान को परखें।

3

मत करो।

आप एक उपप्रक्रिया आदेशों को पर भेजने एक प्राइवेट बनाने और उसके बाद Pty अपने STDIN से जुड़ी के एक छोर से उपप्रक्रिया कांटा करने के लिए चाहते हैं। ,

RNULL = open('/dev/null', 'r') 
WNULL = open('/dev/null', 'w') 

master, slave = pty.openpty() 
print parsedCmd 
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL, 
         stdout=WNULL, stderr=slave) 

इस कोड में Pty stderr क्योंकि यह आदेशों भेजने त्रुटि संदेश के बजाय प्राप्त करता है जुड़ा हुआ है, लेकिन सिद्धांत एक ही है:

यहाँ मेरी कोड के कुछ से एक टुकड़ा है।

+1

subprocess के साथ pty.openpty() का उपयोग न करें - यह जटिल है। Subprocess.PIPE का उपयोग करें, और उपप्रोसेसर मॉड्यूल आपके लिए इसका ख्याल रखे। (साथ ही सरल और अधिक मानक होने के नाते, वह एक पाइप का उपयोग करेगा, जो एक पीटीवी से हल्का वजन है)। – user9876

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