0Pricing
Python Academy · บทเรียน

การดักจับผลลัพธ์

อ่าน stdout และ stderr

การดักจับผลลัพธ์ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

การเก็บ stdout

หากต้องการอ่านสิ่งที่คำสั่งพิมพ์ออกมา ให้ส่ง capture_output=True ข้อความจะปรากฏในแอตทริบิวต์ stdout ของผลลัพธ์

import subprocess

cp = subprocess.run(['echo', 'hello'], capture_output=True)
print(cp.stdout)

ไบต์เทียบกับข้อความ

โดยค่าเริ่มต้น ผลลัพธ์จะเป็นไบต์ ให้ส่ง text=True เพื่อรับสตริงที่ถอดรหัสแล้วแทน ซึ่งโดยทั่วไปเป็นรูปแบบที่คุณต้องการ

import subprocess

cp = subprocess.run(['echo', 'hello'], capture_output=True, text=True)
print(repr(cp.stdout))

การตัดขึ้นบรรทัดใหม่ท้ายข้อความ

ผลลัพธ์ของคำสั่งมักลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ ใช้ .strip() เพื่อลบออกก่อนนำค่าไปใช้งาน

import subprocess

cp = subprocess.run(['echo', 'value'], capture_output=True, text=True)
clean = cp.stdout.strip()
print('[' + clean + ']')

การเก็บ stderr

ข้อผิดพลาดมักถูกส่งไปยัง stderr และเก็บแยกต่างหาก วิธีนี้ทำให้ผลลัพธ์ปกติกับข้อความข้อผิดพลาดแยกจากกันอย่างชัดเจน

import subprocess

cp = subprocess.run(['ls', '/no/such/dir'], capture_output=True, text=True)
print('stdout:', repr(cp.stdout))
print('stderr:', cp.stderr.strip())

การใช้ผลลัพธ์ในโค้ด

ผลลัพธ์ที่เก็บไว้เป็นเพียงสตริง คุณจึงนำไปแยกวิเคราะห์ได้ เช่น แยกบรรทัด แปลงตัวเลข หรือส่งต่อให้ส่วนอื่นของโปรแกรม

import subprocess

cp = subprocess.run(['printf', 'a\nb\nc\n'], capture_output=True, text=True)
lines = cp.stdout.splitlines()
print('line count:', len(lines))
print(lines)

เปลี่ยนเส้นทาง stderr ไปยัง stdout

หากต้องการรวมผลลัพธ์ข้อผิดพลาดเข้ากับกระแสข้อมูลปกติ ให้กำหนด stderr=subprocess.STDOUT จากนั้นทั้งสองส่วนจะปรากฏใน stdout

import subprocess

cp = subprocess.run(['ls', '/no/such/dir'], stdout=subprocess.PIPE,
                    stderr=subprocess.STDOUT, text=True)
print(cp.stdout.strip())

การส่งอินพุต

ส่งข้อมูลไปยัง stdin ของคำสั่งด้วยอาร์กิวเมนต์ input ในตัวอย่างนี้ เราจะส่งข้อความผ่านไปยัง cat

import subprocess

cp = subprocess.run(['cat'], input='piped in\n', capture_output=True, text=True)
print(cp.stdout.strip())

ทางลัด check_output

subprocess.check_output() เรียกใช้คำสั่งและส่งคืน stdout โดยตรง พร้อมทำให้เกิดข้อผิดพลาดเมื่อล้มเหลว เป็นคำสั่งบรรทัดเดียวที่สะดวกสำหรับการเก็บผลลัพธ์

import subprocess

out = subprocess.check_output(['echo', 'quick'], text=True)
print(out.strip())

การทิ้งผลลัพธ์

หากต้องการปิดการแสดงผลของคำสั่ง ให้เปลี่ยนเส้นทางกระแสข้อมูลไปยัง subprocess.DEVNULL

import subprocess

cp = subprocess.run(['echo', 'silent'], stdout=subprocess.DEVNULL)
print('return code only:', cp.returncode)

การจัดการข้อผิดพลาดพร้อมผลลัพธ์

เมื่อใช้ check=True แล้ว CalledProcessError ที่เกิดขึ้นยังคงเก็บ output และ stderr ที่บันทึกไว้สำหรับวิเคราะห์สาเหตุ

import subprocess

try:
    subprocess.run(['ls', '/missing'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print('failed:', e.returncode)
    print('stderr:', e.stderr.strip())

นำทุกอย่างมาประกอบกัน

ตัวช่วยทั่วไปจะเรียกใช้คำสั่ง ตรวจสอบความสำเร็จ และส่งคืนข้อความที่จัดรูปแบบเรียบร้อยแล้ว ตัวช่วยนี้ครอบคลุมรูปแบบการใช้งานทั่วไป

import subprocess

def capture(cmd):
    cp = subprocess.run(cmd, capture_output=True, text=True, check=True)
    return cp.stdout.strip()

print(capture(['echo', 'final result']))

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการเก็บผลลัพธ์

ทบทวน

คุณได้เรียนรู้วิธีเก็บผลลัพธ์:

  • capture_output=True ร่วมกับ text=True จะให้ stdout และ stderr เป็นสตริง
  • รวมกระแสข้อมูลด้วย stderr=subprocess.STDOUT และปิดการแสดงผลด้วย DEVNULL
  • ส่งอินพุตผ่าน input= โดย check_output เป็นทางลัด
  • ข้อผิดพลาดจะเก็บผลลัพธ์ไว้เพื่อการแก้จุดบกพร่อง

ถัดไป: การอ่านตัวแปรสภาพแวดล้อมและโมดูลระบบปฏิบัติการ

คำถามที่พบบ่อย

บทเรียน “การดักจับผลลัพธ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การดักจับผลลัพธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การดักจับผลลัพธ์”

อ่าน stdout และ stderr คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การดักจับผลลัพธ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียกใช้คำสั่งด้วย subprocess
  2. การดักจับผลลัพธ์
  3. สภาพแวดล้อมและโมดูล os
  4. shutil สำหรับการดำเนินการกับไฟล์
← กลับไปที่ Python Academy