سؤال

لماذا يقتل التواصل عملي?أريد عملية تفاعلية ولكن التواصل يفعل شيئا حتى لا أتمكن من اتخاذ إدخال الخام أكثر من ذلك في عملية بلدي.

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 وحدة أو نظائرها لتجنب القضايا المذكورة في لماذا لا مجرد استخدام الأنابيب (بوبين ())?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top