كيفية إخراج نتائج العمليات الفرعية إلى الملفات والمحطة الطرفية في وقت واحد في بايثون
عند استخدام 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