سؤال

أحاول تشغيل "rsync" باستخدام وحدة النمط الفرعي والبوباء داخل مؤشر ترابط. بعد أن أدعو Rsync، أحتاج إلى قراءة الإخراج أيضا. أنا أستخدم طريقة التواصل لقراءة الإخراج. الرمز يعمل بشكل جيد عندما لا أستخدم مؤشر ترابط. يبدو أنه عندما أستخدم مؤشر ترابط معلقة على مكالمة التواصل. شيء آخر لقد لاحظته هو أنه عندما أقوم بتعيين Shell = False لا أحصل على شيء مرة أخرى من التواصل عند تشغيله في مؤشر ترابط.

هل كانت مفيدة؟

المحلول

لم تقدم أي رمز بالنسبة لنا للنظر في، ولكن إليك عينة تقوم بشيء مماثل لما تصفه:

import threading
import subprocess

class MyClass(threading.Thread):
    def __init__(self):
        self.stdout = None
        self.stderr = None
        threading.Thread.__init__(self)

    def run(self):
        p = subprocess.Popen('rsync -av /etc/passwd /tmp'.split(),
                             shell=False,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)

        self.stdout, self.stderr = p.communicate()

myclass = MyClass()
myclass.start()
myclass.join()
print myclass.stdout

نصائح أخرى

إليك تطبيق كبير لا يستخدم المواضيع:باستمرار-الطباعة -Process-الإخراج - أثناء التشغيل - قيد التشغيل

import subprocess

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = ''

    # Poll process for new output until finished
    for line in iter(process.stdout.readline, ""):
        print line,
        output += line


    process.wait()
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise Exception(command, exitCode, output)

execute(['ping', 'localhost'])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top