दिलचस्प पोस्ट
मूल्य से शब्दकोश कुंजी प्राप्त करें एक चार * के एक उपस्ट्रिंग प्राप्त करें jQuery, iframe के भीतर तत्व का चयन करें, जो एक आइफ्रेम के अंदर है आर में संख्याओं के लिए कोमा सेपरेटर? प्रोटोटाइप ऑब्जेक्ट या कन्स्ट्रक्टर के माध्यम से तरीकों की स्थापना, अंतर? मैं डबल क्लिक के माध्यम से इस file.sh निष्पादन योग्य कैसे बना सकता हूँ? AsyncTask: doInBackground () के वापसी मूल्य कहां जाता है? स्ट्रिंग में PHP कोड निष्पादित करें अजगर रेगुलर एक्सप्रेशन में मिलान वाले यूनिकोड वर्ण C ++ में सरणियों के लिए एक विशिष्ट मात्रा में स्मृति आवंटित करने का क्या उद्देश्य है? नक्शा, प्रत्येक में और अंतर क्या है? Linq के साथ IQueryable का उपयोग करना JQuery के साथ इनपुट वैल्यू सेट करने के बाद एन्जिलर मॉडल को अपडेट करें सिंक्रनाइज़ेशन कंटेंट। कैसे कर सकते हैं मुख्य धागा का एक विन्डोज़ फॉर्म्स अनुप्रयोग में रिक्त हो गया है? दो रास्ते / उल्टे नक्शा

उपप्रोसेस रेडलाइन ईओएफ के लिए प्रतीक्षा कर रहा है

मेरे पास एक साधारण सी ++ प्रोग्राम है जो मैं अजगर स्क्रिप्ट के माध्यम से निष्पादित करने की कोशिश कर रहा हूं। (मैं लिपियों को लिखने में बहुत ही नवीन हूं) और मुझे पाइप के माध्यम से आउटपुट पढ़ने में परेशानी हो रही है। मैंने जो देखा है, ऐसा लगता है कि वाचन () ईओफ़ के बिना काम नहीं करेगा, लेकिन मैं कार्यक्रम के बीच में पढ़ना और स्क्रिप्ट को आउटपुट होने पर प्रतिक्रिया देना चाहता हूं। आउटपुट पढ़ने के बजाय, यह सिर्फ अजगर स्क्रिप्ट लटकाए:

#!/usr/bin/env python import subprocess def callRandomNumber(): print "Running the random guesser" rng=subprocess.Popen("./randomNumber", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) i=50 rng.stdin.write("%d\n" % i) output=rng.stdout.readline() output=rng.stdout.readline() callRandomNumber() 

और सी ++ फ़ाइल, जो कि एक और 100 के बीच एक यादृच्छिक संख्या उत्पन्न करती है, फिर उपयोगकर्ता अनुमान लगाते हैं कि जब तक वे सही ढंग से अनुमान न लगाते हैं

 #include<iostream> #include<cstdlib> using namespace std; int main(){ cout<<"This program generates a random number from 1 to 100 and asks the user to enter guesses until they succuessfully guess the number. It then tells the user how many guesses it took them"<<endl; srand(time(NULL)); int num=rand()%100; int guessCount=0; int guess=-1; cout<<"Please enter a number: "; cin>>guess; while(guess!=num){ if(guess>num){cout<<"That guess is too high. Please guess again: ";} else{cout<<"That guess is too low. Please guess again: ";} cin>>guess; guessCount++; } cout<<"Congratulations! You solved it in "<<guessCount<<" guesses!"<<endl; return 0; } 

आखिरकार लक्ष्य को स्क्रिप्ट को द्विआधारी खोज के साथ समस्या का हल करना है, लेकिन अभी के लिए मैं फ़ाइल का अंत होने के बिना एक पंक्ति को पढ़ने में सक्षम होना चाहता हूं

वेब के समाधान से एकत्रित समाधान "उपप्रोसेस रेडलाइन ईओएफ के लिए प्रतीक्षा कर रहा है"

@ रॉन रेइटर ने बताया कि , आप readline() उपयोग नहीं कर सकते क्योंकि cout न्यूलाइन्स को readline() नहीं करता है – आपको readline() std::endl या "\n" है

इंटरैक्टिव उपयोग के लिए, जब आप चाइल्ड प्रोग्राम को बदल नहीं सकते हैं, तो pexpect मॉड्यूल कई सुविधा पद्धतियां प्रदान करता है (और सामान्य तौर पर यह नि: शुल्क के लिए हल करता है: इनपुट / आउटपुट सीधे / से टर्मिनल (stdin / stdout के बाहर) और ब्लॉक-बफरिंग समस्या ):

 #!/usr/bin/env python import sys if sys.version_info[:1] < (3,): from pexpect import spawn, EOF # $ pip install pexpect else: from pexpect import spawnu as spawn, EOF # Python 3 child = spawn("./randomNumber") # run command child.delaybeforesend = 0 child.logfile_read = sys.stdout # print child output to stdout for debugging child.expect("enter a number: ") # read the first prompt lo, hi = 0, 100 while lo <= hi: mid = (lo + hi) // 2 child.sendline(str(mid)) # send number index = child.expect([": ", EOF]) # read prompt if index == 0: # got prompt prompt = child.before if "too high" in prompt: hi = mid - 1 # guess > num elif "too low" in prompt: lo = mid + 1 # guess < num elif index == 1: # EOF assert "Congratulations" in child.before child.close() break else: print('not found') child.terminate() sys.exit(-child.signalstatus if child.signalstatus else child.exitstatus) 

यह काम करता है लेकिन यह एक द्विआधारी खोज है (पारंपरिक रूप से) बग हो सकता है

यहां समान कोड है जो तुलना के लिए subprocess मॉड्यूल का उपयोग करता है:

 #!/usr/bin/env python from __future__ import print_function import sys from subprocess import Popen, PIPE p = Popen("./randomNumber", stdin=PIPE, stdout=PIPE, bufsize=1, # line-buffering universal_newlines=True) # enable text mode p.stdout.readline() # discard welcome message: "This program gener... readchar = lambda: p.stdout.read(1) def read_until(char): buf = [] for c in iter(readchar, char): if not c: # EOF break buf.append(c) else: # no EOF buf.append(char) return ''.join(buf).strip() prompt = read_until(':') # read 1st prompt lo, hi = 0, 100 while lo <= hi: mid = (lo + hi) // 2 print(prompt, mid) print(mid, file=p.stdin) # send number prompt = read_until(':') # read prompt if "Congratulations" in prompt: print(prompt) print(mid) break # found elif "too high" in prompt: hi = mid - 1 # guess > num elif "too low" in prompt: lo = mid + 1 # guess < num else: print('not found') p.kill() for pipe in [p.stdin, p.stdout]: try: pipe.close() except OSError: pass sys.exit(p.wait()) 

मुझे पूरा यकीन है कि आपके सी ++ प्रोग्राम में नई लाइन जोड़ने से पठनलाइन वापस आ जाएंगे।

आपको stdin को स्पष्ट रूप से बंद करना पड़ सकता है, इसलिए बच्चे की प्रक्रिया को रोकना बंद हो जाएगा, जो मुझे लगता है कि आपके कोड के साथ क्या हो रहा है – यह एक टर्मिनल पर सबसे ऊपर randomnumber और जाँच कर सकता है कि क्या randomnumber की स्थिति सो रही है और अगर यह अपेक्षित समय के बाद 0% CPU उपयोग कर रहा है जो इसे निष्पादित करने के लिए ले जाएगा।

संक्षेप में, यदि आप rng.stdin.close() को rng=subprocess(...) कॉल के बाद rng=subprocess(...) , तो यह कोई समस्या नहीं हो सकती है एक और विकल्प output=rng.communicate(stdin="%d\n" % i) और output[0] और output[1] को देखते हैं जो क्रमशः stdout और stderr हैं। आप यहां communicate पर जानकारी पा सकते हैं।