2011-12-01 21 views
5

मैं एक गैर अजगर उपप्रक्रिया के लिए बाहर शेल और यह अजगर से stdin और stdout के वारिस की अनुमति के लिए कोशिश कर रहा हूँ। - मैं अजगर - subprocesses और अजगर खोल

subprocess.Popen

उपयोग कर रहा हूँ यह शायद अगर मैं एक कंसोल से बोल रहा हूँ काम करेगा, लेकिन जब मैं अजगर खोल

(मैं जिस तरह से निष्क्रिय उपयोग कर रहा हूँ) का उपयोग कर रहा यह निश्चित रूप से काम नहीं करता है

वहाँ अजगर को समझाने के लिए एक गैर अजगर उपप्रक्रिया मुद्रित करने के लिए यह अजगर खोल करने के लिए stdout है अनुमति देने के लिए कोई तरीका है?

उत्तर

6

यह दोनों एक स्क्रिप्ट से और इंटरैक्टिव दुभाषिया से काम करता है, लेकिन निष्क्रिय से नहीं:

subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin) 

आप वस्तुओं जो निष्क्रिय प्रदान करती है sys.stdin और sys.stdout के तर्कों के रूप subprocess.Popen करने के लिए उपयोग नहीं कर सकते। इन वस्तुओं (निष्क्रिय खोल खिड़की के इंटरफेस) फ़ाइल की तरह हैं, लेकिन वे नहीं वास्तविक फ़ाइल fileno विशेषताओं के साथ हैंडल कर रहे हैं, और यूनिक्स जैसे ऑपरेटिंग सिस्टम एक fileno की आवश्यकता होती है stdin या एक उपप्रक्रिया के लिए stdout के रूप में निर्दिष्ट किया जाना है। मैं विंडोज़ के लिए बात नहीं कर सकता, लेकिन मुझे लगता है कि इसकी समान आवश्यकताएं हैं।

+0

विंडोज आईडीईई पर pythonw.exe के माध्यम से चलता है, इसलिए इसमें कंसोल 'stdin', 'stdout', और' stderr' फ़ाइल हैंडल भी नहीं है। – eryksun

+0

लेकिन क्या यह पाइथन को करने में एक तरीका है? – dmjalund

4

Taymon के जवाब कि निष्क्रिय के stdin/stdout में आपके सवाल का सीधे संबोधित करते हैं वास्तव में फाइल की तरह वस्तुओं और नहीं मानक फ़ाइल एक सांत्वना/टर्मिनल के साथ जुड़े धाराओं कर रहे हैं। इसके अलावा, विंडोज आईडीईई में pythonw.exe के साथ चलता है, जिसमें एक संलग्न Win32 कंसोल भी नहीं है।

यह कहा गया है कि, यदि आपको वास्तविक समय में उपयोगकर्ता को मुद्रित करने के लिए किसी प्रोग्राम से आउटपुट की आवश्यकता है, तो कई मामलों में (लेकिन सभी नहीं) आप आउटपुट लाइन को लाइन से पढ़ सकते हैं और तदनुसार इसे गूंज सकते हैं। विंडोज आईडीएलई में मेरे लिए निम्नलिखित काम करता है। यह लाइन द्वारा एक पाइप stdout लाइन से पढ़ने का प्रदर्शन करता है। यह भी पता चलता है तो क्या होता है प्रक्रिया पाइप, जिसमें मामले readline जब तक या तो बफर भरा है या पाइप बंद कर देता है को अवरुद्ध कर देगा बफ़र्स। यह बफरिंग मैन्युअल कुछ कार्यक्रमों (जैसे अजगर दुभाषिया के -u विकल्प के रूप में) के साथ निष्क्रिय किया जा सकता है, और वहाँ इस तरह के रूप में stdbuf यूनिक्स के लिए कामकाज से जुड़े हैं।

test1.py

import sys 
import subprocess 

def test(cmd): 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
    it = iter(p.stdout.readline, b'') 
    for line in it: 
     print(line.rstrip().decode('ascii')) 

print('Testing buffered subprocess...') 
test([sys.executable, 'test2.py']) 

print('\nTesting unbuffered subprocess...') 
#-u: unbuffered binary stdout and stderr 
test([sys.executable, '-u', 'test2.py']) 

test2.py:

import time 

for i in range(5): 
    print(i) 
    time.sleep(1) 

निष्क्रिय में उत्पादन एक देरी और दूसरे के बाद सभी को एक बार मुद्रित अंक के पहले सेट के साथ, निम्नलिखित होना चाहिए लाइन द्वारा मुद्रित लाइन सेट करें।

Testing buffered subprocess... 
0 
1 
2 
3 
4 

Testing unbuffered subprocess... 
0 
1 
2 
3 
4