"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إعادة توجيه مخرجات العملية الفرعية إلى الملفات والمحطة الطرفية في وقت واحد في بايثون؟

كيفية إعادة توجيه مخرجات العملية الفرعية إلى الملفات والمحطة الطرفية في وقت واحد في بايثون؟

تم النشر بتاريخ 2024-11-08
تصفح:358

How to Redirect Child Process Output to Files and Terminal Simultaneously in Python?

كيفية إخراج نتائج العمليات الفرعية إلى الملفات والمحطة الطرفية في وقت واحد في بايثون

عند استخدام subprocess.call()، من الممكن التحديد واصفات الملفات مثل outf وerrf لإعادة توجيه stdout وstderr إلى ملفات محددة. ومع ذلك، لن يتم عرض هذه النتائج بشكل متزامن في الوحدة الطرفية.

الحل باستخدام Popen وThreading:

للتغلب على هذا، يمكننا الاستفادة من Popen مباشرة والاستفادة من stdout=وسيطة PIPE للقراءة من stdout للعملية الفرعية. وإليك الطريقة:

import subprocess
from threading import Thread

def tee(infile, *files):
    # Forward output from `infile` to `files` in a separate thread
    def fanout(infile, *files):
        for line in iter(infile.readline, ""):
            for f in files:
                f.write(line)

    t = Thread(target=fanout, args=(infile,)   files)
    t.daemon = True
    t.start()
    return t

def teed_call(cmd_args, **kwargs):
    # Override `stdout` and `stderr` arguments with PIPE to capture standard outputs
    stdout, stderr = [kwargs.pop(s, None) for s in ["stdout", "stderr"]]
    p = subprocess.Popen(
        cmd_args,
        stdout=subprocess.PIPE if stdout is not None else None,
        stderr=subprocess.PIPE if stderr is not None else None,
        **kwargs
    )
    
    # Create threads to simultaneously write to files and terminal
    threads = []
    if stdout is not None:
        threads.append(tee(p.stdout, stdout, sys.stdout))
    if stderr is not None:
        threads.append(tee(p.stderr, stderr, sys.stderr))
        
    # Join the threads to ensure IO completion before proceeding
    for t in threads:
        t.join()

    return p.wait()

باستخدام هذه الوظيفة، يمكننا تنفيذ العمليات الفرعية وكتابة مخرجاتها إلى كل من الملفين والمحطة الطرفية في نفس الوقت:

outf, errf = open("out.txt", "wb"), open("err.txt", "wb")
teed_call(["cat", __file__], stdout=None, stderr=errf)
teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0)
teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3