เขียนโปรแกรมภาษา Python เพื่อเรียกใช้คำสั่ง Linux Command Line - mrolarik/simple-iot GitHub Wiki

  • การเขียนโปรแกรมภาษา Python เพื่อเรียกใช้คำสั่ง Linux หรือ Linux Command Line จะต้อง import ไลบรารี่ชื่อ subprocess ดังนี้
import subprocess
  • จากนั้นจึงจะสามารถใช้คำสั่ง เช่น call หรือ 'Popen' เพื่อเรียกใช้คำสั่ง Linux ได้ เช่น
subprocess.Popen('ls')

ผลลัพธ์ที่ได้จากคำสั่ง แสดงดังนี้

>>> call_cpu.py  cpu.sh  cpu_usage.sh  netpie_cpu_usage.py  test.py

ผลลัพธ์ที่ได้คือแสดงรายชื่อไฟล์และโฟลเดอร์ทั้งหมด ซึ่งก็คือคำสั่ง ls ใน Linux command

  • หากต้องการเก็บผลลัพธ์ไว้ในตัวแปร จะต้องเพิ่มคำสั่งดังต่อไปนี้
import subprocess

output = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE)
output = output.stdout.read()

print output

ผลลัพธ์ที่ได้จะเปลี่ยนไปดังนี้

call_cpu.py
cpu.sh
cpu_usage.sh
netpie_cpu_usage.py
test.py

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

output = output.split("\n")

หากต้องการทราบจำนวนของสมาชิกสามารถใช้คำสั่ง len เพื่อตรวจสอบ ดังนี้

len(output)

จากตัวอย่าง ผลลัพธ์ที่ได้คือ 6 เนื่องจากมีบรรทัดว่างจำนวน 1 บรรทัด ดังนั้นต้องลบ (Remove) บรรทัดว่างทิ้งไป ด้วยคำสั่ง

output = filter(None, output)
len(output)
print(output)

ผลลัพธ์ที่ได้

5
['call_cpu.py', 'cpu.sh', 'cpu_usage.sh', 'netpie_cpu_usage.py', 'test.py']

คำสั่ง filter จะทำหน้าที่ลบสมาชิกของ list ที่ว่าง และคำสั่ง print จะแสดงข้อมูลสมาชิกของ output ดังนั้น ผลลัพธ์ที่ได้คือมีจำนวนสมาชิกเท่ากับ 5

ตัวอย่างโปรแกรมที่สมบูรณ์

#----------------command_ls.py-------------------
import subprocess

output = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE)
output = output.stdout.read()

output = output.split("\n")
output = filter(None, output)

print("Number of file(s) and folder(s): ", len(output))
print output

จากนั้นให้รันโปรแกรมด้วยคำสั่ง

$ python command_ls.py

ผลลัพธ์ที่ได้คือ

('Number of file(s) and folder(s): ', 5)
['call_cpu.py', 'cpu.sh', 'cpu_usage.sh', 'netpie_cpu_usage.py', 'test.py']

รายละเอียดเพิ่มเติม

https://docs.python.org/3.4/library/subprocess.html?highlight=subprocess