ওএস.সিস্টেমের আউটপুটটি একটি ভেরিয়েবলে বরাদ্দ করুন এবং এটি স্ক্রিনে প্রদর্শিত হতে বাধা দিন


304

আমি os.systemএকটি চলকটি ব্যবহার করে চালিত কমান্ডের আউটপুট বরাদ্দ করতে চাই এবং এটিকে পর্দায় আউটপুট হওয়া থেকে আটকাতে চাই। তবে, নীচের কোডে, আউটপুটটি স্ক্রিনে প্রেরণ করা হয় এবং এর জন্য মুদ্রিত মান var0 হয় যা আমি অনুমান করি যে কমান্ডটি সফলভাবে চালিত হয়েছে কি না sign ভেরিয়েবলকে কমান্ড আউটপুট বরাদ্দ করার এবং এটিকে স্ক্রিনে প্রদর্শিত হতে বাধা দেওয়ার কোনও উপায় আছে কি?

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
@ সেভ, অবশ্যই আপনি পাইপ এবং সি ডাব্লু / ব্যবহার করতে পারেন subprocess.Popen- কেবল যোগ করুন shell=True!
অ্যালেক্স মার্তেলি

@ অ্যালেক্সমার্টেলি shell=True(সাধারণত) খুব খারাপ ধারণা! আপনি যা চালিয়ে যাচ্ছেন তা সম্পর্কে আপনাকে অবশ্যই খুব নিশ্চিত হতে হবে :)
ইগনাসিও ফার্নান্দেজ

উত্তর:


443

পাইথনের সমতুল্য " ব্যাশ ব্যাকটিক্স " থেকে, যা আমি অনেক আগে জিজ্ঞাসা করেছি, আপনি কী ব্যবহার করতে চান তা হ'ল popen:

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

পাইথন ৩.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
@ ক্রিসবাঞ্চ কেন সুপার্রোসেস এর চেয়ে ভাল সমাধান os.popen?
মার্টিন থোমা

6
আপনার (প্রায়) কখনই ব্যবহার করা উচিত নয় shell=TrueDocs.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পাইথন ২.7 যুক্ত হয়েছে ডক্স.পিথন.আর.
২..7

1
stderr=subprocess.STDOUTপাশাপাশি স্ট্যান্ডার্ড ত্রুটিগুলি ক্যাপচার করতে যোগ করুন
ডোলান অ্যান্টুচি

47

কমান্ড মডিউলটি এটি করার জন্য যুক্তিসঙ্গতভাবে উচ্চ-স্তরের উপায়:

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

স্থিতি 0, আউটপুট হ'ল / ইত্যাদি / পরিষেবার সামগ্রী the


43
কমান্ড মডিউলটির ডকুমেন্টেশন থেকে উদ্ধৃতি দেওয়া : "সংস্করণ ২.6 থেকে অবচয়
ক্রিশ্চিয়ান সিউপিতু

4
নিশ্চিত যে এটি পুরানো হয়েছে তবে কখনও কখনও আপনি কোডের কয়েকটি লাইনে দ্রুত এবং সহজেই কিছু করতে চান।
anon58192932

5
@ অ্যাডভোক্ট সাব-প্রসেসের চেক_আউটপুট কমান্ডটি দেখুন। এটি দ্রুত, সহজ এবং শীঘ্রই হ্রাস হবে না!
লুক স্ট্যানলি

29

অজগর 3.5+ এর জন্য আপনাকে সাবপ্রসেস মডিউল থেকে রান ফাংশনটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে । এটি এমন কোনও CompletedProcessবস্তু দেয় যা আপনি সহজেই আউটপুট পাশাপাশি রিটার্ন কোডও অর্জন করতে পারেন can যেহেতু আপনি কেবল আউটপুটটিতে আগ্রহী তাই আপনি এর মতো কোনও ইউটিলিটি র‌্যাপার লিখতে পারেন।

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
আমি ওএস.সিস্টেম 0-এ ফিরে আসার সাথে একই সমস্যাটি পেয়েছিলাম, কিন্তু আমি এই পদ্ধতিটি চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করে! এবং একটি বোনাস হিসাবে এটি সুন্দর এবং পরিপাটি লাগে :) ধন্যবাদ!
সোফি Muspratt

4

আমি এটি ওএস.সিস্টেম টেম্প ফাইল দিয়ে করি:

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

পাইথন ২.6 এবং ৩ বিশেষত স্টাডআউট এবং স্টডারারের জন্য পিআইপিই ব্যবহার করা এড়াতে বলে।

সঠিক উপায়

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.