تعطيل إخراج وحدة التحكم من subprocess.popen في بيثون
-
12-09-2019 - |
سؤال
أركض بيثون 2.5 على Windows، وفي مكان ما في التعليمات البرمجية لدي
subprocess.Popen("taskkill /PID " + str(p.pid))
لقتل أي نافذة بواسطة PID. المشكلة هي أنه بدون إعداد الأنابيب باللون البرمجي، ما زلت أحصل على الإخراج إلى وحدة التحكم - النجاح: تم إنهاء العملية مع PID 2068. لقد قمت بتصحيحها لإيجادها في subprocess.py، ولكن لا يمكن أن تذهب من هناك.
أي شخص يعرف كيفية تعطيل هذا؟
المحلول
fh = open("NUL","w")
subprocess.Popen("taskkill /PID " + str(p.pid), stdout = fh, stderr = fh)
fh.close()
نصائح أخرى
import os
from subprocess import check_call, STDOUT
DEVNULL = open(os.devnull, 'wb')
try:
check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
finally:
DEVNULL.close()
أنا دائما تمر في tuples إلى subprocess لأنه ينقذني القلق بشأن الهروب. Check_Call يضمن (أ) انتهت البرنامج الفرعي قبل يغلق الأنبوب و (ب) عدم تجاهل الفشل في العملية المسماة. أخيرا، os.devnull
هو المعيار، وسيلة عبر منصة للقول NUL
في بيثون 2.4+.
لاحظ أنه في PY3K، يوفر Subprocess DevNull من أجلك، حتى تتمكن من الكتابة فقط:
from subprocess import check_call, DEVNULL, STDOUT
check_call(("taskkill", "/PID", str(p.pid)), stdout=DEVNULL, stderr=STDOUT)
لا تنتمي إلى StackOverflow