ฉันจะเริ่มต้นคำสั่ง bash ด้วย args หลายอัน (เช่น " sudo apt update
") จากสคริปต์ไพ ธ อนได้อย่างไร?
ฉันจะเริ่มต้นคำสั่ง bash ด้วย args หลายอัน (เช่น " sudo apt update
") จากสคริปต์ไพ ธ อนได้อย่างไร?
คำตอบ:
คำตอบของ @ milne ทำงานได้ แต่subprocess.call()
ให้ความคิดเห็นเล็กน้อย
ฉันชอบที่จะใช้subprocess.check_output()
เพื่อให้คุณสามารถวิเคราะห์สิ่งที่พิมพ์ไปยัง stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
ส่งข้อผิดพลาดเมื่อออกจากศูนย์โดยคำสั่งที่เรียกใช้
โปรดทราบว่าสิ่งนี้จะไม่เรียกใช้bash
หรือเชลล์อื่นถ้าคุณไม่ได้ระบุshell
อาร์กิวเมนต์คำหลักให้กับฟังก์ชั่น (เช่นเดียวกับที่เป็นจริงsubprocess.call()
และคุณไม่ควรถ้าไม่จำเป็นเพราะมันจะทำให้เกิดอันตรายต่อความปลอดภัย) มันจะเรียก คำสั่ง
หากคุณพบว่าตัวเองทำมาก (แตกต่างกัน) สวดคำสั่งจากหลามคุณอาจต้องการที่จะดูที่plumbum เมื่อคุณสามารถทำให้ (IMO) อ่านได้มากขึ้น:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
หรือos.system
) อดีต: res = os.popen('sudo apt update').read()
? @Aththon
subprocess
แม้ว่าos.system
และos.popen
มีอยู่แล้ว PEPs ดังกล่าวไม่ได้รับการยอมรับเพียงเล็กน้อย หลายคนให้ความคิดมากกว่านี้กับคุณหรือฉัน และsubprocess
ได้รับการปรับปรุงตั้งแต่ปีพ. ศ. 2546 และอื่น ๆ ก็ยังอยู่ที่นั่นเพื่อความเข้ากันได้แบบย้อนหลัง ให้คุณเปลี่ยนos.system
หน้าสีแดงด้วยตนเองแล้ว: โมดูลย่อยจะให้บริการที่มีประสิทธิภาพยิ่งขึ้นสำหรับการวางไข่กระบวนการใหม่และรับผลลัพธ์ การใช้โมดูลนั้นจะดีกว่าการใช้ฟังก์ชั่นนี้
sudo
จะยิ่งทำให้รุนแรงขึ้นเท่านั้น บางทีการใช้ python-apt เป็นทางออกที่ดีกว่า (ฉันไม่ได้มองด้วยตนเอง)
เป็นไปได้ที่คุณจะใช้ bash เป็นโปรแกรมโดยมีพารามิเตอร์ -c สำหรับดำเนินการคำสั่ง:
ตัวอย่าง:
bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
subprocessโมดูลถูกออกแบบมาเพื่อทำสิ่งนี้:
import subprocess
subprocess.call(["sudo", "apt", "update"])
หากคุณต้องการให้สคริปต์ยุติหากคำสั่งล้มเหลวคุณอาจพิจารณาใช้check_call()
แทนการแยกรหัสส่งคืนด้วยตัวคุณเอง:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(ฉันใช้ yum ในขณะที่ฉันใช้ Fedora เป็นระบบปฏิบัติการหลัก)
subprocess.call()
กำลังปิดกั้นในขณะที่subprocess.Popen()
ไม่ได้ปิดกั้น ..
นอกจากนี้คุณสามารถใช้ 'os.popen'
ตัวอย่าง:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
เอาท์พุท:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
ใช้โมดูลกระบวนการย่อย
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())