Python Subprocess ตัวอย่างป๊อปอัพ

Python Subprocess Taw Xyang Px Pxaph



กระบวนการย่อยของ Python เป็นหนึ่งในโมดูลที่มีประโยชน์ซึ่งใช้ในการรันคำสั่งเชลล์ กระบวนการ และรันสคริปต์อื่นหรือไฟล์ปฏิบัติการโดยใช้สคริปต์ Python นอกจากนี้ยังสามารถใช้เพื่อเปลี่ยนเส้นทางข้อมูลจากกระบวนการหนึ่งไปยังอีกกระบวนการหนึ่งและจัดการข้อผิดพลาดที่เกิดจากกระบวนการย่อย โมดูลกระบวนการย่อยมีหลายคลาสที่ใช้เพื่อวัตถุประสงค์ที่หลากหลาย คลาส “subprocess.Popen” เป็นหนึ่งในคลาสของโมดูลนี้ที่ใช้โต้ตอบกับกระบวนการภายนอกและทำงานประเภทต่างๆ ระหว่างกระบวนการ การใช้งานคลาส “subprocess.Popen” หลายครั้งในสคริปต์ Python จะแสดงอยู่ในบทช่วยสอนนี้

หัวข้อเนื้อหา:

  1. เรียกใช้คำสั่ง Linux อย่างง่าย
  2. เรียกใช้คำสั่งพร้อมข้อมูลอินพุต
  3. เรียกใช้สคริปต์ Python
  4. จัดการกับข้อผิดพลาดของกระบวนการย่อย
  5. คืนรหัสของกระบวนการย่อยเปิดขึ้น
  6. เปลี่ยนเส้นทางผลลัพธ์ของกระบวนการย่อยไปยังไฟล์
  7. การประมวลผลหลายตัวโดยใช้ Subprocess.Popen
  8. จัดการสตรีมอินพุตและเอาท์พุต
  9. ควบคุมการหมดเวลาและความล่าช้า
  10. อ่านอินพุตสตรีมมิ่ง

เรียกใช้คำสั่ง Linux อย่างง่าย

คำสั่ง 'date' ใช้เพื่อแสดงวันที่และเวลาของระบบปัจจุบัน สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ซึ่งจะสร้างกระบวนการย่อยที่ดำเนินการคำสั่ง “date” และพิมพ์ผลลัพธ์ของคำสั่งนี้:

#นำเข้าโมดูล

นำเข้า กระบวนการย่อย

#กำหนดคำสั่งสำหรับกระบวนการย่อยและ

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( [ 'วันที่' ] , มาตรฐาน = กระบวนการย่อย . ท่อ )

#ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ

มาตรฐาน , stderr = เอาท์พุท สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

เอาท์พุท:







ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ก่อนหน้า:



  หน้า 1



ไปที่ด้านบน





เรียกใช้คำสั่งพร้อมข้อมูลอินพุต

คำสั่ง “wc” พร้อมตัวเลือก “-c” ใช้เพื่อนับจำนวนอักขระทั้งหมดของค่าสตริงที่มาพร้อมกับคำสั่งนี้ สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ซึ่งสร้างกระบวนการย่อยด้วยฟังก์ชัน Popen() เพื่อรันคำสั่ง “wc –c” ค่าสตริงถูกนำมาจากเทอร์มินัลหลังจากรันสคริปต์ และอักขระทั้งหมดของสตริงอินพุตจะถูกพิมพ์ในเอาต์พุต

#นำเข้าโมดูล

นำเข้า กระบวนการย่อย

#กำหนดคำสั่งสำหรับกระบวนการย่อยและ

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( [ 'ห้องน้ำ' , '-ค' ] , มาตรฐาน = กระบวนการย่อย . ท่อ )

#ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ

มาตรฐาน , stderr = เอาท์พุท สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

เอาท์พุท:



ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นสำหรับค่าอินพุต “Python Subprocess Examples”:

ไปที่ด้านบน

เรียกใช้สคริปต์ Python

สร้างไฟล์ Python ชื่อ “sum.py” ด้วยสคริปต์ต่อไปนี้ซึ่งคำนวณผลรวมของตัวเลขสองตัว และตัวเลขเหล่านี้ระบุเป็นอาร์กิวเมนต์บรรทัดคำสั่ง:

sum.py

#นำเข้าโมดูลที่จำเป็น

นำเข้า ระบบ

#นับข้อโต้แย้งทั้งหมด

n = เท่านั้น ( ระบบ . หาเรื่อง )

#Add ค่าอาร์กิวเมนต์สองค่าแรก

ผลรวม = ภายใน ( ระบบ . หาเรื่อง [ 1 ] ) + ภายใน ( ระบบ . หาเรื่อง [ 2 ] )

#พิมพ์ผลบวก

พิมพ์ ( “ผลรวมของ” + ระบบ . หาเรื่อง [ 1 ] + ' และ ' + ระบบ . หาเรื่อง [ 2 ] + ' เป็น' , ผลรวม )

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

#นำเข้าโมดูล

นำเข้า กระบวนการย่อย

#Run สคริปต์ python ในกระบวนการย่อยและ

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( [ 'หลาม3' , 'sum.py' , '25' , '55' ] , มาตรฐาน = กระบวนการย่อย . ท่อ ) #ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ

มาตรฐาน , stderr = เอาท์พุท สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ก่อนหน้า:

ไปที่ด้านบน

`

จัดการกับข้อผิดพลาดของกระบวนการย่อย

สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ที่จัดการข้อผิดพลาดของกระบวนการย่อยโดยใช้บล็อก 'try-ยกเว้น' คำสั่งถูกนำมาจากผู้ใช้และถูกดำเนินการโดยกระบวนการย่อย ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นหากคำสั่งที่ไม่ถูกต้องถูกนำมาจากผู้ใช้

#นำเข้าโมดูล

นำเข้า กระบวนการย่อย

นำเข้า ระบบ

#รับคำสั่งจากผู้ใช้

สั่งการ = ป้อนข้อมูล ( 'ป้อนคำสั่งที่ถูกต้อง:' )

พยายาม : :

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( [ สั่งการ ] , มาตรฐาน = กระบวนการย่อย . ท่อ )

#ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ

มาตรฐาน , stderr = เอาท์พุท สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

ยกเว้น : :

พิมพ์ ( 'ข้อผิดพลาด:' , ระบบ . exc_info ( ) )

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหากใช้คำสั่ง “pwd” เป็นอินพุตซึ่งเป็นคำสั่งที่ถูกต้อง:

  p4-1

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหากใช้คำสั่ง “usr” เป็นอินพุตซึ่งเป็นคำสั่งที่ถูกต้อง:

  p4-2

ไปที่ด้านบน

คืนรหัสของกระบวนการย่อยเปิดขึ้น

สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ที่รันคำสั่ง “ls” ผ่านกระบวนการย่อยเพื่อรับรายการไฟล์ Python ทั้งหมดจากตำแหน่งปัจจุบัน สคริปต์รอให้กระบวนการย่อยเสร็จสิ้นและพิมพ์โค้ดส่งคืน

#นำเข้าโมดูล

นำเข้า กระบวนการย่อย

นำเข้า ระบบ

#กำหนดคำสั่ง

สั่งการ = [ 'ฉัน' , '-l' , '*.ไพ' ]

พยายาม : :

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( สั่งการ , มาตรฐาน = กระบวนการย่อย . ท่อ ,

stderr = กระบวนการย่อย . ท่อ , ข้อความ = จริง )

#รอดำเนินการให้เสร็จสิ้น

retCode = เอาท์พุท รอ ( )

#พิมพ์รหัสส่งคืน

พิมพ์ ( 'รหัสส่งคืน:' , retCode )

ยกเว้น : :

#พิมพ์ข้อความผิดพลาด

พิมพ์ ( 'ข้อผิดพลาด:' , ระบบ . exc_info ( ) )

เอาท์พุท:

ผลลัพธ์ที่คล้ายกันจะปรากฏขึ้นหลังจากรันสคริปต์ก่อนหน้า:

ไปที่ด้านบน

เปลี่ยนเส้นทางผลลัพธ์ของกระบวนการย่อยไปยังไฟล์

สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ที่เขียนเอาต์พุตของกระบวนการย่อยในไฟล์ข้อความ คำสั่งที่ดำเนินการโดยกระบวนการย่อยนั้นนำมาจากผู้ใช้

#โมดูลนำเข้า

นำเข้า กระบวนการย่อย

#กำหนดชื่อไฟล์

ชื่อไฟล์ = 'outfile.txt'

#รับคำสั่งปิง

คำสั่ง = ป้อนข้อมูล ( 'ป้อนคำสั่ง ping:' )

#Split อินพุตที่ถ่ายตามช่องว่าง

หาเรื่อง = คำสั่ง . แยก ( )

#เขียนเอาต์พุตคำสั่งลงในไฟล์

กับ เปิด ( ชื่อไฟล์ , 'ใน' ) เช่น ข้อมูลเอาท์พุต:

กระบวนการ = กระบวนการย่อย . ป๊อปเปน ( หาเรื่อง , มาตรฐาน = ข้อมูลล้าสมัย )

#รอดำเนินการให้เสร็จสิ้น

กลับ_รหัส = กระบวนการ. รอ ( )

เอาท์พุท:

ตามผลลัพธ์ต่อไปนี้ “ping -c 3 www.google.com ” นำมาจากผู้ใช้และคำสั่ง “cat” ใช้เพื่อแสดงเนื้อหาของไฟล์ที่เขียนโดยกระบวนการย่อย:

ไปที่ด้านบน

การประมวลผลหลายตัวโดยใช้ Subprocess.Popen

สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ซึ่งแสดงการใช้การประมวลผลหลายตัวโดยใช้กระบวนการย่อย ในที่นี้ ฟังก์ชันชื่อ display_msg() ถูกเรียกหลายครั้งโดยใช้การประมวลผลหลายตัว

#นำเข้าโมดูลที่จำเป็น

นำเข้า การประมวลผลหลายตัว

นำเข้า กระบวนการย่อย

#กำหนดฟังก์ชันที่จะถูกเรียกโดยการประมวลผลหลายตัว

แน่นอน display_msg ( n ) : :

#กำหนดคำสั่งด้วยฟังก์ชัน format()

คำสั่ง = 'echo 'การเขียนโปรแกรมหลาม'' . รูปแบบ ( n )

#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()

กระบวนการ = กระบวนการย่อย . ป๊อปเปน ( คำสั่ง , เปลือก = จริง , มาตรฐาน = กระบวนการย่อย . ท่อ )

#ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ

มาตรฐาน , ข้อผิดพลาด = กระบวนการ. สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

#เรียกใช้ฟังก์ชัน 5 ครั้งโดยสร้าง multiprocessing.Pool

กับ การประมวลผลหลายตัว สระน้ำ ( การประมวลผลหลายตัว cpu_count ( ) ) เช่น MP:

#แผนที่ฟังก์ชั่น

MP แผนที่ ( display_msg , พิสัย ( 1 , 5 ) )

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ก่อนหน้า:

ไปที่ด้านบน

จัดการสตรีมอินพุตและเอาท์พุต

สร้างไฟล์ข้อความชื่อ “test.txt” โดยมีเนื้อหาต่อไปนี้ก่อนสร้างสคริปต์ Python ของตัวอย่างนี้

ทดสอบ.txt

เพิร์ล

หลาม

ทุบตี

PHP

สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ซึ่งใช้กระบวนการย่อยหนึ่งเพื่ออ่านเนื้อหาของไฟล์ “test.txt” และกระบวนการย่อยอื่นเพื่อค้นหาคำเฉพาะในไฟล์ข้อความนั้น ที่นี่คำว่า 'python' ถูกค้นหาใน 'ไฟล์ test.txt' ที่มีคำนี้

#โมดูลนำเข้า

นำเข้า กระบวนการย่อย

#กำหนดกระบวนการสำหรับสตรีมอินพุต

อยู่ในขั้นตอน = กระบวนการย่อย . ป๊อปเปน ( [ 'แมว' , 'test.txt' ] , มาตรฐาน = กระบวนการย่อย . ท่อ , ข้อความ = ตรู > #กำหนดกระบวนการสำหรับสตรีมเอาต์พุต

ออก_กระบวนการ = กระบวนการย่อย . ป๊อปเปน (

[ 'จับ' , 'หลาม' ] , มาตรฐาน = อยู่ในขั้นตอน. มาตรฐาน ,

มาตรฐาน = กระบวนการย่อย . ท่อ , ข้อความ = จริง )

#จัดเก็บผลลัพธ์ของกระบวนการอินพุตและเอาท์พุต

เอาท์พุท , _ = ออก_กระบวนการ สื่อสาร ( )

#พิมพ์ผลงาน

พิมพ์ ( 'ผลลัพธ์:' , เอาท์พุท )

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์:

ไปที่ด้านบน

ควบคุมกระบวนการย่อยโดยใช้ตัวจับเวลา

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

#นำเข้าโมดูลกระบวนการย่อย

นำเข้า กระบวนการย่อย

#นำเข้าโมดูลตัวจับเวลา

จาก เกลียว นำเข้า ตัวจับเวลา

#กำหนดคำสั่ง

คำสั่ง = [ 'ปิง' , 'www.example.com' ]

#เปิดกระบวนการ

พี = กระบวนการย่อย . ป๊อปเปน (

คำสั่ง , มาตรฐาน = กระบวนการย่อย . ท่อ , stderr = กระบวนการย่อย . ท่อ )

#กำหนดตัวจับเวลา

จับเวลา = ตัวจับเวลา ( 2 , แลมบ์ดา กระบวนการ: กระบวนการ ฆ่า ( ) , [ พี ] )

พยายาม : :

#เริ่มจับเวลา

จับเวลา เริ่ม ( )

#อ่านเอาท์พุต

มาตรฐาน , _ = พี สื่อสาร ( )

#งานพิมพ์

พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )

ยกเว้น : :

#พิมพ์ข้อความผิดพลาด

พิมพ์ ( 'ข้อผิดพลาด:' , ระบบ . exc_info ( ) )

ในที่สุด : :

#หยุดจับเวลา

จับเวลา ยกเลิก ( )

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์:

ไปที่ด้านบน

อ่านอินพุตสตรีมมิ่ง

สร้างไฟล์ Python ที่อ่านเนื้อหาของเอาต์พุตกระบวนการย่อยโดยใช้ลูป ' while' และจัดเก็บเนื้อหาไว้ในตัวแปร เนื้อหาของตัวแปรนี้จะถูกพิมพ์ในภายหลัง ที่นี่ คำสั่ง 'curl' ถูกใช้ในกระบวนการย่อยสำหรับ www.google.com URL

#โมดูลนำเข้า

นำเข้า กระบวนการย่อย

#กำหนดคำสั่ง

คำสั่ง = [ 'ขด' , 'www.example.com' ]

พี = กระบวนการย่อย . ป๊อปเปน ( คำสั่ง , มาตรฐาน = กระบวนการย่อย . ท่อ ,

stderr = กระบวนการย่อย . ท่อ , ข้อความ = จริง >

#เริ่มต้นตัวแปรเอาท์พุต

เอาท์พุท = ''

ในขณะที่ จริง : :

#อ่านกระบวนการออกทีละบรรทัด

ln = พี มาตรฐาน . อ่านบรรทัด ( )

#ยุติจากการวนซ้ำเมื่อกระบวนการย่อยเสร็จสิ้น

ถ้า ไม่ เข้าสู่ระบบ:

หยุดพัก

เอาท์พุท = เอาท์พุต + อินพุท

#พิมพ์เส้น

พิมพ์ ( เอาท์พุท )

#รับโค้ดคืนหลังเสร็จสิ้นกระบวนการ

กลับ_รหัส = พี รอ ( )

#พิมพ์รหัสส่งคืน

พิมพ์ ( 'รหัสส่งคืน:' , กลับ_รหัส )

เอาท์พุท:

ส่วนสุดท้ายของเอาต์พุตทั้งสามจะแสดงในภาพต่อไปนี้ รหัสส่งคืนหลังจากเสร็จสิ้นกระบวนการย่อยคือ 0:

ไปที่ด้านบน

บทสรุป

การใช้งานที่แตกต่างกันของกระบวนการย่อย Python Popen() จะแสดงอยู่ในบทช่วยสอนนี้โดยใช้สคริปต์ Python หลายสคริปต์ที่จะช่วยให้ผู้ใช้ Python รู้การใช้งานพื้นฐานของฟังก์ชันนี้