जवाबों:
@ मिल्ने का जवाब काम करता है, लेकिन subprocess.call()
आपको थोड़ी प्रतिक्रिया देता है।
मैं उपयोग करना पसंद करता हूं subprocess.check_output()
ताकि आप विश्लेषण कर सकें कि क्या स्टडआउट के लिए मुद्रित किया गया था:
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()
, और आपको आवश्यक नहीं होना चाहिए क्योंकि यह सुरक्षा के खतरे को लागू करता है), यह सीधे इनवॉइस करता है आदेश।
यदि आप अपने आप को पायथन से बहुत सारे (अलग) कमांड इनवोकेशन करते हुए पाते हैं, तो आप प्लम्बम को देखना चाह सकते हैं । उसके साथ आप (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()
? @ एंथन
subprocess
हालांकि यह पहले से मौजूद है os.system
और बनाने के लिए तर्क बताता है os.popen
। ऐसे पीईपी स्वीकार किए जाने के लिए गैर-तुच्छ हैं। कई लोगों ने आपको या मैं कभी भी इससे अधिक विचार दिया है। और subprocess
2003 के बाद से सुधार हुआ है, अन्य अभी भी पिछड़े संगतता के लिए हैं। क्या आपने os.system
मैनुअल पेज को लाल कर दिया है : उपप्रोसेस मॉड्यूल नई प्रक्रियाओं को पैदा करने और उनके परिणाम प्राप्त करने के लिए अधिक शक्तिशाली सुविधाएं प्रदान करता है; इस फ़ंक्शन का उपयोग करने के लिए उस मॉड्यूल का उपयोग करना बेहतर है।
sudo
केवल और अधिक गंभीर बनाने जा रहा है। शायद अजगर-उपयुक्त का उपयोग करना एक बेहतर उपाय है (मैंने खुद उस पर ध्यान नहीं दिया है)।
उपप्रक्रिया मॉड्यूल यह करने के लिए बनाया गया है:
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
(मैं यम का उपयोग कर रहा हूं क्योंकि मैं फेडोरा का उपयोग मुख्य ओएस के रूप में कर रहा हूं)
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())