ทำความเข้าใจ 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 codesubprocess.Popen()- สร้าง process แบบ non-blocking ควบคุม stdin/stdout/stderrsubprocess.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 อาจต้องปรับคำสั่ง