หัวข้อเนื้อหา:
- เรียกใช้คำสั่ง Linux อย่างง่าย
- เรียกใช้คำสั่งพร้อมข้อมูลอินพุต
- เรียกใช้สคริปต์ Python
- จัดการกับข้อผิดพลาดของกระบวนการย่อย
- คืนรหัสของกระบวนการย่อยเปิดขึ้น
- เปลี่ยนเส้นทางผลลัพธ์ของกระบวนการย่อยไปยังไฟล์
- การประมวลผลหลายตัวโดยใช้ Subprocess.Popen
- จัดการสตรีมอินพุตและเอาท์พุต ส
- ควบคุมการหมดเวลาและความล่าช้า
- อ่านอินพุตสตรีมมิ่ง
เรียกใช้คำสั่ง Linux อย่างง่าย
คำสั่ง 'date' ใช้เพื่อแสดงวันที่และเวลาของระบบปัจจุบัน สร้างไฟล์ Python ด้วยสคริปต์ต่อไปนี้ซึ่งจะสร้างกระบวนการย่อยที่ดำเนินการคำสั่ง “date” และพิมพ์ผลลัพธ์ของคำสั่งนี้:
#นำเข้าโมดูลนำเข้า กระบวนการย่อย
#กำหนดคำสั่งสำหรับกระบวนการย่อยและ
#เปิดกระบวนการโดยใช้ฟังก์ชัน Popen()
เอาท์พุท = กระบวนการย่อย . ป๊อปเปน ( [ 'วันที่' ] , มาตรฐาน = กระบวนการย่อย . ท่อ )
#ดึงผลลัพธ์และข้อผิดพลาดโดยการสื่อสารกับกระบวนการ
มาตรฐาน , stderr = เอาท์พุท สื่อสาร ( )
#พิมพ์ผลงาน
พิมพ์ ( มาตรฐาน ถอดรหัส ( ) )
เอาท์พุท:
ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันสคริปต์ก่อนหน้า:
เรียกใช้คำสั่งพร้อมข้อมูลอินพุต
คำสั่ง “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” เป็นอินพุตซึ่งเป็นคำสั่งที่ถูกต้อง:
ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหากใช้คำสั่ง “usr” เป็นอินพุตซึ่งเป็นคำสั่งที่ถูกต้อง:
คืนรหัสของกระบวนการย่อยเปิดขึ้น
สร้างไฟล์ 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 รู้การใช้งานพื้นฐานของฟังก์ชันนี้