بيثون سوبروسيس التواصل يقتل عملية بلدي
-
21-12-2019 - |
سؤال
لماذا يقتل التواصل عملي?أريد عملية تفاعلية ولكن التواصل يفعل شيئا حتى لا أتمكن من اتخاذ إدخال الخام أكثر من ذلك في عملية بلدي.
from sys import stdin
from threading import Thread
from time import sleep
if __name__ == '__main__':
print("Still Running\n")
x = raw_input()
i = 0
while ('n' not in x ) :
print("Still Running " + str(i) + " \r\n")
x = raw_input()
i += 1
print("quit")
print(aSubProc.theProcess.communicate('y'))
print(aSubProc.theProcess.communicate('y'))
استثناء!
self.stdin.write(input)
ValueError: I/O operation on closed file
المحلول
communicate
و wait
طرق Popen
الكائنات ، أغلق PIPE
بعد عودة العملية.إذا كنت تريد البقاء على اتصال مع عملية محاولة شيء من هذا القبيل:
import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()
نصائح أخرى
لماذا يقتل التواصل عملي?
من المستندات ل Popen.communicate(input=None, timeout=None)
:
التفاعل مع العملية:إرسال البيانات إلى ستدين.قراءة البيانات من ستدوت و
ستدير ، حتى يتم الوصول إلى نهاية الملف. انتظر حتى تنتهي العملية. التأكيد على الألغام
يمكنك الاتصال .communicate()
مرة واحدة فقط.هذا يعني أنه يجب عليك تقديم كل المدخلات مرة واحدة:
#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
p = Popen([sys.executable, 'child.py'], stdin=PIPE, stdout=PIPE)
print p.communicate(os.linesep.join('yyn'))[0]
الناتج
Still Running
Still Running 0
Still Running 1
quit
لاحظ الخطوط الجديدة المضاعفة:واحد من '\r\n'
وآخر من print
بيان نفسها في البرنامج النصي الخاص بك لعملية الطفل.
يظهر الإخراج أن العملية الفرعية تلقت ثلاثة أسطر إدخال بنجاح ('y'
, 'y'
, ، و 'n'
).
وهنا رمز مماثل باستخدام subprocess.check_output()
في input
المعلمة من بيثون3.4:
#!/usr/bin/env python3.4
import os
import sys
from subprocess import check_output
output = check_output(['python2', 'child.py'], universal_newlines=True,
input='\n'.join('yyn'))
print(output, end='')
وتنتج نفس الناتج.
إذا كنت ترغب في تقديم مدخلات مختلفة اعتمادا على الردود من العمليات الفرعية ، فاستخدم pexpect
وحدة أو نظائرها لتجنب القضايا المذكورة في لماذا لا مجرد استخدام الأنابيب (بوبين ())?