कैसे अजगर स्क्रिप्ट में एक बश कमांड निष्पादित करने के लिए


जवाबों:


18

@ मिल्ने का जवाब काम करता है, लेकिन 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()? @ एंथन
alper

1
@alper पढ़ें 0324 python.org/dev/peps/pep-0324subprocessहालांकि यह पहले से मौजूद है os.systemऔर बनाने के लिए तर्क बताता है os.popen। ऐसे पीईपी स्वीकार किए जाने के लिए गैर-तुच्छ हैं। कई लोगों ने आपको या मैं कभी भी इससे अधिक विचार दिया है। और subprocess2003 के बाद से सुधार हुआ है, अन्य अभी भी पिछड़े संगतता के लिए हैं। क्या आपने os.systemमैनुअल पेज को लाल कर दिया है : उपप्रोसेस मॉड्यूल नई प्रक्रियाओं को पैदा करने और उनके परिणाम प्राप्त करने के लिए अधिक शक्तिशाली सुविधाएं प्रदान करता है; इस फ़ंक्शन का उपयोग करने के लिए उस मॉड्यूल का उपयोग करना बेहतर है।
एंथन

1
@alper हाँ आप कर सकते थे। जैसा कि मैंने संकेत दिया कि एक संभावित सुरक्षा खतरा है, इसलिए मुझे नहीं पता कि आपको क्यों लगता है कि इसकी सिफारिश की गई है। और आह्वान sudoकेवल और अधिक गंभीर बनाने जा रहा है। शायद अजगर-उपयुक्त का उपयोग करना एक बेहतर उपाय है (मैंने खुद उस पर ध्यान नहीं दिया है)।
एंथन

1
@alper उस मामले में पर एक गंभीर नज़र रखना सीसा , यह उस के साथ गति अप करने के लिए हो रही लायक है।
एंथन

1
@alper यदि आप Python3 पर हैं तो आपको ऐसा करने की आवश्यकता है, Python2 पर आप नहीं। कृपया टिप्पणी के रूप में यहाँ चैट सिस्टम का उपयोग न करें। यदि आपके पास कोई प्रश्न है तो उसे इस तरह पोस्ट करें।
एंथन

8

यह संभव है कि आप कमांड को निष्पादित करने के लिए पैरामीटर -c के साथ एक प्रोग्राम के रूप में बैश का उपयोग करें:

उदाहरण:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])

7

उपप्रक्रिया मॉड्यूल यह करने के लिए बनाया गया है:

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 (मैं यम का उपयोग कर रहा हूं क्योंकि मैं फेडोरा का उपयोग मुख्य ओएस के रूप में कर रहा हूं)
डामोर

3
आप वर्ग कोष्ठक भूल गए
मिलिंद डंबरे

1
भी ध्यान रखें कि subprocess.call()जबकि ब्लॉक कर रहा है subprocess.Popen()गैर अवरुद्ध .. है
heemayl

"ब्लॉकिंग" से आपका क्या मतलब है? @heemayl
alper

2

इसके अलावा आप '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

0

उपप्रोसेस मॉड्यूल का उपयोग करें

import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())

जब मैं इसका उपयोग करता हूं तो मुझे एक त्रुटि क्यों मिल रही है
एक्वाग्रेमलिन

subprocess.check_call (["sudo", "apt", "update"])
aquagremlin

CalledProcessError Traceback (सबसे हालिया कॉल अंतिम) <ipython-input-21-33ce645708e7> में <मॉड्यूल> () ----> 1 सबप्रोसेसर.check_call (["sudo," apt "," update "]) / usr / usr / lib / python2.7 / subprocess.pyc in check_call (* popenargs, ** kwargs) 188 यदि cmd कुछ भी नहीं है: 189 cmd = popenargs [0] -> 190 बढ़ाएं CallSprocessError (retcode, cmd) 191 वापसी 0 192 CalledProcessError: Command '[' सुडो ','
एप्ट

यह त्रुटि केवल तब होती है जब मैं इसे ज्यूपिटर नोटबुक में
चलाता हूं

हो सकता है कि मैं एक नया सवाल शुरू कर
दूं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.