दिलचस्प पोस्ट
सीएसएस: पृष्ठभूमि का रंग सेट करें जो खिड़की की चौड़ाई का 50% है JQuery AJAX के साथ क्रॉस-डोमेन समापन बिंदु लोड करना कैसे कर्ल के साथ PHP के लिए JSON पोस्ट करने के लिए कोको में iTunes गीत शीर्षक स्क्रोलिंग jQuery यूआई क्रमबद्ध, फिर एक डेटाबेस में आदेश लिखें 403 जावा के साथ निषिद्ध लेकिन वेब ब्राउज़र नहीं? यूनिक्स में कैरिएज़ रिटर्न निकालें क्लिक किए गए तत्व को कोणीयर्स में प्रवेश करना भविष्य का नाशक `std :: async 'अवरोधन से क्यों लौट आया है? AngularJS + Django Rest Framework + CORS (CSRF कुकी क्लाइंट में प्रदर्शित नहीं हो रही है) सी # में सामान्य श्रेणी के लिए अंकगणितीय ऑपरेटर ओवरलोडिंग PHP और mysql के माध्यम से मेनू के असीमित स्तर को कैसे बनाया जाए JSF संसाधन लाइब्रेरी क्या है और इसका उपयोग कैसे किया जाना चाहिए? कैसे बड़े बयानों और उदाहरणों से बचें ट्विटर बूटस्ट्रैप को कैसे नामित करें, तो शैलियों में संघर्ष नहीं होता

उपप्रक्रिया संवाद (')' के साथ 'हाँ' रिपोर्टिंग त्रुटि

पायथन में कमांड चलाने के लिए मैं निम्नलिखित फ़ंक्शन का उपयोग कर रहा हूं:

def run_proc(cmd): child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = child.communicate() returncode = child.returncode return stdout, stderr, returncode 

यह हमेशा ठीक काम कर रहा है, लेकिन अब मैं पाइप आउटपुट को stdin के लिए yes प्रोग्राम का उपयोग करने की कोशिश कर रहा हूं। मैं चलाने की कोशिश कर रहा हूं, वह निम्न है:

 yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade 

लेकिन मेरा मानना ​​है कि इसे एक सामान्य उदाहरण के साथ प्रतिस्थापित किया जा सकता है, जैसे:

 yes | head -3 | cat 

मेरी समस्या यह है कि अगर मैंने कोई भी आदेश चलाने की कोशिश की तो yes | इसमें उपरोक्त सबप्रोसेस। पॉपिन में त्रुटि संदेश होंगे:

 yes: standard output: Broken pipe yes: write error 

मेरे लिए यह लगता है कि पाइपिंग अभी भी काम करती है, जैसा कि yes | head -3 | cat से देखा जा सकता है yes | head -3 | cat yes | head -3 | cat का जवाब: yyy

मेरे पास निम्न प्रश्न हैं:

  1. हां पाइपिंग अभी भी कार्यात्मक है, भले ही हाँ रिपोर्ट त्रुटि है?
  2. मेरे द्वारा यह कैसे किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "उपप्रक्रिया संवाद (')' के साथ 'हाँ' रिपोर्टिंग त्रुटि"

मुद्दा यह है कि पायथन 3.2+ से पहले subprocess मॉड्यूल SIGPIPE सिग्नल हेन्डलर को डिफ़ॉल्ट एक्शन में पुनर्स्थापित नहीं करता है । यही कारण है कि आपको इसके बजाय EPIPE लिखने की त्रुटि EPIPE

पायथन 3.2+ में

 >>> from subprocess import check_output >>> check_output("yes | head -3", shell=True) b'y\ny\ny\n' 

जब head निकल जाता है तो yes SIGPIPE द्वारा मार डाला जाता है

पायथन 2 में:

 >>> from subprocess import check_output >>> check_output("yes | head -3", shell=True) yes: standard output: Broken pipe yes: write error 'y\ny\ny\n' 

yes EPIPE लिखना त्रुटि मिली त्रुटि की उपेक्षा करना सुरक्षित है यह SIGPIPE रूप में एक ही सूचना का संचार करता है

समस्या का समाधान करने के लिए, आप preexec_fn पैरामीटर का उपयोग करके पायथन 2 में restore_signals का अनुकरण कर सकते हैं:

 >>> from subprocess import check_output >>> import signal >>> def restore_signals(): # from http://hg.python.org/cpython/rev/768722b2ae0a/ ... signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ') ... for sig in signals: ... if hasattr(signal, sig): ... signal.signal(getattr(signal, sig), signal.SIG_DFL) ... >>> check_output("yes | head -3", shell=True, preexec_fn=restore_signals) 'y\ny\ny\n' 

दूसरा सवाल जवाब देता है … मैं कोशिश करूँगा और आपको आसपास काम दे दूँगा

क्या आप ऐसा कुछ नहीं कर सकते

 proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin = subprocess.PIPE) for i in range(10): #send 10 y's time.sleep(1) # 1 second apart proc.stdin.write("y") #you may also need to send a newline ... print proc.communicate() 

नीचे देखें (मैं देरी से परेशान नहीं किया क्योंकि सिर वास्तव में बहुत कुछ नहीं कर रहा है)

 >>> import subprocess >>> proc = subprocess.Popen("head -3", ... shell = True, ... stdout = subprocess.PIPE, ... stderr=subprocess.PIPE, ... stdin=subprocess.PIPE) >>> for i in range(10): ... proc.stdin.write("y\n") ... >>> proc.communicate() ('y\ny\ny\n', '') 

कह रही है:

 yes | head -3 

head को एक SIGPIPE को yes भेजने का कारण बनता है, एक बार उसने इनपुट के 3 लाइनों को पढ़ने के लिए किया है, यानी यह yes को समाप्त करने के लिए एक संकेत भेजता है

 $ yes | head -3 y y y $ echo "${PIPESTATUS[@]}" 141 0 

समाधान एक SIGPIPE से बचने के लिए होगा!