จะรันสคริปต์ทุบตีโดยใช้ Python ได้อย่างไร

หากคุณใช้ Linux คุณจะต้องชอบคำสั่งเชลล์อย่างแน่นอน

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

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

แต่ถ้าคุณมี bash script อยู่แล้วที่คุณต้องการเรียกใช้โดยใช้ Python ล่ะ?

มีวิธีใดบ้างในการรันคำสั่ง bash และสคริปต์ใน Python?

ใช่ Python มีโมดูลในตัวที่เรียกว่ากระบวนการย่อยซึ่งใช้ในการดำเนินการคำสั่งและสคริปต์ภายในสคริปต์ Python มาดูวิธีการรันคำสั่ง bash และสคริปต์ในสคริปต์ Python โดยละเอียด

การดำเนินการคำสั่งทุบตี

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

ส่วนใหญ่มีวิธีหนึ่งและหนึ่งคลาสที่ควรรู้จากโมดูลกระบวนการย่อย พวกเขากำลังเรียกใช้และ Popen ทั้งสองช่วยให้เรารันคำสั่ง bash ในสคริปต์ Python มาดูกันทีละคน

กระบวนการย่อย.run()

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

มาดูตัวอย่างกันอย่างรวดเร็ว

import subprocess
subprocess.run(["ls"])

สคริปต์ด้านบนแสดงรายการทั้งหมดในไดเร็กทอรีการทำงานปัจจุบันตามที่สคริปต์อยู่ ไม่มีอาร์กิวเมนต์สำหรับคำสั่งในสคริปต์ข้างต้น เราได้ให้เฉพาะคำสั่งทุบตี เราสามารถจัดเตรียมอาร์กิวเมนต์เพิ่มเติมให้กับคำสั่ง ls เช่น -l, -a, -la เป็นต้น

มาดูตัวอย่างสั้นๆ พร้อมอาร์กิวเมนต์คำสั่ง

import subprocess
subprocess.run(["ls", "-la"])

คำสั่งดังกล่าวแสดงไฟล์ทั้งหมดรวมถึงไฟล์ที่ซ่อนอยู่พร้อมกับสิทธิ์ เราได้จัดเตรียมอาร์กิวเมนต์ la ซึ่งแสดงไฟล์และไดเร็กทอรีข้อมูลเพิ่มเติมและไฟล์ที่ซ่อนอยู่

  Netflix ไม่ทำงาน? 7 วิธีในการแก้ไขปัญหา Netflix

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

มาดูตัวอย่างกัน

import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)

ตรวจสอบให้แน่ใจว่าคุณไม่มีไฟล์ที่มีชื่อ sample.txt ในไดเร็กทอรีการทำงาน ค่าของอาร์กิวเมนต์คีย์เวิร์ด stderr คือ PIPE ซึ่งช่วยในการส่งคืนข้อผิดพลาดในออบเจ็กต์ เราสามารถเข้าถึงได้ในภายหลังด้วยชื่อเดียวกัน และข้อความอาร์กิวเมนต์ของคีย์เวิร์ดช่วยบอกว่าเอาต์พุตควรเป็นสตริง

ในทำนองเดียวกัน เราสามารถดักจับผลลัพธ์ของคำสั่งโดยใช้อาร์กิวเมนต์คีย์เวิร์ด stdout

import subprocess
result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)

subprocess.run() – อินพุต

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

มาดูตัวอย่างกัน

import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")

ในโปรแกรมข้างต้น สคริปต์ Python add.py จะใช้ตัวเลขสองตัวเป็นอินพุต เราได้ให้อินพุตกับสคริปต์ Python โดยใช้อาร์กิวเมนต์คีย์เวิร์ดอินพุต

กระบวนการย่อย Popen()

คลาส subprocess.Popen() นั้นล้ำหน้ากว่าเมธอด subprocess.run() มันทำให้เรามีตัวเลือกมากขึ้นในการดำเนินการคำสั่ง เราจะสร้างอินสแตนซ์ของ subprocess.Popen() และใช้สำหรับสิ่งต่าง ๆ เช่น การทราบสถานะของการดำเนินการคำสั่ง การรับผลลัพธ์ การป้อนข้อมูล ฯลฯ.,

มีหลายวิธีของคลาส subprocess.Popen() ที่เราจำเป็นต้องรู้ มาดูทีละตัวพร้อมกับตัวอย่างโค้ด

รอ

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

import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")

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

import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()

print("Completed!")

หากคุณเห็นผลลัพธ์ของโค้ดด้านบน คุณจะรู้ว่าการรอทำงานจริง พิมพ์คำสั่งจะดำเนินการหลังจากเสร็จสิ้นการดำเนินการคำสั่ง

  วิธีค้นหาหมายเลขประจำเครื่องและ IMEI สำหรับ Apple Watch ของคุณ

สื่อสาร

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

import subprocess
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)

subprocess.Popen() – อินพุต

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

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

มาดูตัวอย่างกัน

import subprocess
process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
process.stdin.write("2 3")
process.stdin.close()
print(process.stdout.read())

โพล

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

import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True)
while True:
    output = process.stdout.readline()
    if output:
    	print(output.strip())
    result = process.poll()
    if result is not None:
        break

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

การดำเนินการสคริปต์ทุบตี

เราได้เห็นสองวิธีในการรันคำสั่ง ตอนนี้เรามาดูวิธีการรันสคริปต์ทุบตีในสคริปต์ Python

กระบวนการย่อยมีวิธีการที่เรียกว่าการโทร วิธีนี้ใช้เพื่อรันสคริปต์ทุบตี วิธีการส่งคืนรหัสออกจากสคริปต์ทุบตี รหัสทางออกเริ่มต้นสำหรับสคริปต์ทุบตีคือ 0 มาดูตัวอย่างกัน

  WDYM ย่อมาจากอะไร?

สร้าง bash script ด้วยชื่อ practice.sh ดังนี้

#!/bin/bash

echo "Hello, World!"
exit 1

ตอนนี้เขียนสคริปต์ Python รันสคริปต์ทุบตีด้านบน

import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)

คุณจะได้รับผลลัพธ์ต่อไปนี้เมื่อคุณเรียกใช้สคริปต์ Python ด้านบน

Hello, World!
1

บทสรุป

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

แฮปปี้โค้ดดิ้ง 👨‍💻

เรื่องล่าสุด

x