एक चर के लिए os.system का आउटपुट असाइन करें और इसे स्क्रीन पर प्रदर्शित होने से रोकें


305

मैं एक कमांड के आउटपुट os.systemको एक वैरिएबल का उपयोग करके असाइन करना चाहता हूं और इसे स्क्रीन पर आउटपुट होने से रोकता हूं । लेकिन, नीचे दिए गए कोड में, आउटपुट स्क्रीन पर भेजा जाता है और इसके लिए मुद्रित मूल्य var0 होता है, जो मुझे लगता है कि कमांड सफलतापूर्वक चला या नहीं। क्या चर को कमांड आउटपुट असाइन करने का कोई तरीका है और इसे स्क्रीन पर प्रदर्शित होने से भी रोक सकता है?

var = os.system("cat /etc/services")
print var #Prints 0


4
का उपयोग न करें os.system(और न ही os.popen, इस सवाल का जवाब आप स्वीकार किए जाते हैं के अनुसार): उपयोग subprocess.Popen, यह जिस तरह से बेहतर!
एलेक्स मार्टेली

1
@AlexMartelli, एक एक जटिल आदेशों (जैसे पाइप) subprocess.Popen () में उपयोग कर सकते हैं नहीं है, लेकिन os.system के साथ एक कर सकते हैं
vak

2
@वाक, बेशक आप पाइप और सी w / subprocess.Popen- का उपयोग कर सकते हैं - बस जोड़ें shell=True!
एलेक्स मार्टेली

@AlexMartelli shell=Trueएक बहुत बुरा विचार है (आम तौर पर)! आपको इस बात पर बहुत यकीन होना चाहिए कि आप क्या कर रहे हैं :)
इग्नासियो फर्नांडीज

जवाबों:


444

" पायथन में बैश बैकटिक्स के समतुल्य " से, जो मैंने बहुत समय पहले पूछा था कि आप क्या उपयोग करना चाहते हैं popen:

os.popen('cat /etc/services').read()

पायथन 3.6 के लिए डॉक्स से ,

यह सबप्रोसेस का उपयोग करके लागू किया गया है। उपप्रकारों के साथ प्रबंधन और संवाद करने के अधिक शक्तिशाली तरीकों के लिए उस वर्ग के दस्तावेज देखें।


यहां इसके लिए संबंधित कोड दिया गया है subprocess:

import subprocess

proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print "program output:", out

6
ध्यान दें कि वाल्टर का subprocess.check_outputसमाधान पाइथोनिक वन-लाइनर के करीब है, ऐसा लगता है कि आप देख रहे हैं, जब तक आप परवाह नहीं करते हैं stderr
chbrown

11
@ChrisBunch क्यों एक बेहतर समाधान है os.popen?
मार्टिन थॉमा

6
आपको (लगभग) कभी भी उपयोग नहीं करना चाहिए shell=True। देखें docs.python.org/3/library/...
dylnmc

44
मैं इसे भर में आता रहता हूं और हर बार मुझे आश्चर्य होता है - स्पष्ट कोड की एक पंक्ति के बजाय जटिल कोड की तीन पंक्तियों का होना बेहतर क्यों है?
Ant6n

3
न केवल आपको (लगभग) कभी भी उपयोग नहीं करना चाहिए shell=True, लेकिन यह इस मामले में भी गलत है। shell=Trueबनाता है शेल के बजाय बच्चे प्रक्रिया catहै, इसलिए outऔर errकी stdout / stderr हैं खोल की तुलना में प्रक्रिया नहीं बल्कि catप्रक्रिया
villapx

180

आप उस subprocessमॉड्यूल को भी देखना चाहेंगे , जिसे पायथन popenकॉल के पूरे परिवार को बदलने के लिए बनाया गया था ।

import subprocess
output = subprocess.check_output("cat /etc/services", shell=True)

इसका लाभ यह है कि आपके द्वारा आदेशों को लागू करने के तरीके में एक टन लचीलापन है, जहां मानक / बाहर / त्रुटि धाराएं जुड़ी हुई हैं, आदि।


2
ध्यान दें, check_outputअजगर के साथ जोड़ा गया था 2.7 docs.python.org/2.7/library/…
phyatt

1
stderr=subprocess.STDOUTमानक त्रुटियों को पकड़ने के लिए जोड़ें
Dolan Antenucci

47

कमांड मॉड्यूल ऐसा करने के लिए एक उच्च स्तरीय तरीका है:

import commands
status, output = commands.getstatusoutput("cat /etc/services")

स्थिति 0 है, आउटपुट / etc / सेवाओं की सामग्री है।


43
कमांड मॉड्यूल के प्रलेखन से उद्धरण : "संस्करण 2.6 से पदावनत: पायथन में कमांड मॉड्यूल को हटा दिया गया है। इसके बजाय उपप्रोसेस मॉड्यूल का उपयोग करें।"
क्रिश्चियन सियुपिटु

4
यकीन है कि यह पुराना है, लेकिन कभी-कभी आप कोड की कुछ लाइनों में जल्दी और आसानी से कुछ हासिल करना चाहते हैं।
anon58192932

5
@advocate सबप्रोसेस के check_output कमांड को देखें। यह त्वरित, आसान है, और जल्द ही ह्रास नहीं होगा!
ल्यूक स्टेनली

29

अजगर 3.5+ के लिए यह अनुशंसा की जाती है कि आप उपप्रोसेस मॉड्यूल से रन फ़ंक्शन का उपयोग करें । यह एक CompletedProcessऑब्जेक्ट देता है , जिसमें से आप आउटपुट के साथ-साथ रिटर्न कोड भी आसानी से प्राप्त कर सकते हैं। चूंकि आप केवल आउटपुट में रुचि रखते हैं, आप इस तरह से एक उपयोगिता आवरण लिख सकते हैं।

from subprocess import PIPE, run

def out(command):
    result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
    return result.stdout

my_output = out("echo hello world")
# Or
my_output = out(["echo", "hello world"])

रन () के लिए "
कैप्चर_आउटपुट

24

मुझे पता है कि यह पहले ही उत्तर दिया जा चुका है, लेकिन मैं पोपेन को कॉल करने from x import xऔर कार्यों के माध्यम से कॉल करने के लिए एक संभावित बेहतर तरीका साझा करना चाहता था :

from subprocess import PIPE, Popen


def cmdline(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
    )
    return process.communicate()[0]

print cmdline("cat /etc/services")
print cmdline('ls')
print cmdline('rpm -qa | grep "php"')
print cmdline('nslookup google.com')

1
3 साल बाद, मेरे लिए यही काम आया। मैंने इसे एक अलग फ़ाइल में फेंक दिया cmd.py, और फिर अपनी मुख्य फ़ाइल में मैंने from cmd import cmdlineइसे लिखा और आवश्यकतानुसार उपयोग किया।
फारेस केए

1
मैं os.system के साथ 0 जारी करने के साथ एक ही मुद्दा प्राप्त कर रहा था, लेकिन मैंने इस पद्धति की कोशिश की और यह बहुत अच्छा काम करता है! और एक बोनस के रूप में यह अच्छा और साफ लग रहा है :) धन्यवाद!
सोफी मुसप्रट

4

मैं इसे os.system अस्थायी फ़ाइल के साथ करता हूँ:

import tempfile,os
def readcmd(cmd):
    ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
    fpath = ftmp.name
    if os.name=="nt":
        fpath = fpath.replace("/","\\") # forwin
    ftmp.close()
    os.system(cmd + " > " + fpath)
    data = ""
    with open(fpath, 'r') as file:
        data = file.read()
        file.close()
    os.remove(fpath)
    return data

1

पायथन 2.6 और 3 विशेष रूप से स्टडआउट और स्टेडर के लिए PIPE के उपयोग से बचने के लिए कहते हैं।

सही तरीका है

import subprocess

# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()

# now operate on the file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.