Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้โมดูล Subprocess ใน Python

ทำความเข้าใจ Process

เมื่อรันโปรแกรม OS จะสร้าง process (isolated) ใช้ resource CPU, RAM, Disk และ kernel data structures ไม่เห็น process อื่น ไม่รบกวนกัน

เป้าหมายของ OS

กระจายงานให้ process อย่างยุติธรรม และตอบสนองผู้ใช้ ใช้ Task Manager (Windows), Activity Monitor (macOS), top (Linux) ดูสถานะ process

เข้าถึงข้อมูล Process ด้วยโมดูล os


import os
print(f"Process ID: {os.getpid()}")
print(f"User ID: {os.getuid()}, Group ID: {os.getgid()}")
print(f"Current Working Directory: {os.getcwd()}")

โมดูล subprocess

Python แนะนำให้ใช้ subprocess สำหรับรัน system commands สร้าง process ใหม่ ส่ง/รับข้อมูล จัดการ error codes

ฟังก์ชันหลัก

  • subprocess.call() - รอคำสั่งจบ คืนค่า return code
  • subprocess.Popen() - สร้าง process แบบ non-blocking ควบคุม stdin/stdout/stderr
  • subprocess.check_output() - รันคำสั่ง คืนค่า stdout (raise exception ถ้า return code ไม่ใช่ 0)

ตัวอย่าง: ดึงข้อมูล disk space ด้วย df -h


from io import StringIO
import pandas as pd
import subprocess

diskspace = "df"
diskspace_arg = "-h"
sp = subprocess.Popen([diskspace, diskspace_arg], stdout=subprocess.PIPE)
b = StringIO(sp.communicate()[0].decode('utf-8'))
df = pd.read_csv(b, sep=",")
print(df)

ตัวอย่าง: ใช้ check_output ได้ output รายละเอียด


import subprocess

def uname_func():
    return subprocess.call(["uname", "-a"])

def disk_func():
    return subprocess.check_output(["pydf", "-a"])

def main():
    userinfo = uname_func()
    discinfo = disk_func()
    print(discinfo.decode('utf-8'))
    # แยกบรรทัด
    content = discinfo.decode('utf-8').split("\n")
    print(content)

main()

สรุป

  • ใช้ subprocess.Popen สำหรับควบคุม process แบบละเอียด (streaming I/O)
  • ใช้ subprocess.check_output สำหรับรันคำสั่งสั้น ได้ output ทั้งหมดทีเดียว
  • รันบน Linux/Unix ได้ผลดีที่สุด Windows อาจต้องปรับคำสั่ง