এই প্রশ্নের উত্তরটি আপনি ব্যবহার করছেন পাইথনের সংস্করণে on সবচেয়ে সহজ পদ্ধতির হ'ল subprocess.check_outputফাংশনটি ব্যবহার করা :
>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
check_outputএকটি একক প্রোগ্রাম চালায় যা ইনপুট হিসাবে কেবল আর্গুমেন্ট নেয়। 1 এটি মুদ্রিত হিসাবে ফলাফল ঠিক ফেরত দেয় stdout। আপনার যদি ইনপুট লেখার দরকার পড়ে stdinতবে বিভাগ runবা Popenবিভাগগুলিতে যান। আপনি যদি জটিল শেল কমান্ডগুলি কার্যকর করতে চান shell=Trueতবে এই উত্তরটির শেষে নোটটি দেখুন ।
check_outputফাংশন এখনও ব্যাপক ব্যবহার (2.7+) এ Python- র প্রায় সব সংস্করণের উপর কাজ করে। 2 তবে সাম্প্রতিক সংস্করণগুলির জন্য এটি আর প্রস্তাবিত পদ্ধতির নয় is
পাইথনের আধুনিক সংস্করণ (3.5 বা তার বেশি): run
আপনি যদি পাইথন 3.5 বা তার বেশি ব্যবহার করেন এবং পিছনের দিকে সামঞ্জস্যের প্রয়োজন না হয় তবে নতুন runফাংশনটি প্রস্তাবিত। এটি subprocessমডিউলটির জন্য একটি খুব সাধারণ, উচ্চ-স্তরের এপিআই সরবরাহ করে । কোনও প্রোগ্রামের আউটপুট ক্যাপচার subprocess.PIPEকরতে, stdoutকীওয়ার্ড আর্গুমেন্টে পতাকাটি পাস করুন । তারপরে stdoutপ্রত্যাবর্তিত CompletedProcessঅবজেক্টের বৈশিষ্ট্যটি অ্যাক্সেস করুন :
>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
রিটার্ন মান হ'ল একটি bytesঅবজেক্ট, সুতরাং আপনি যদি একটি সঠিক স্ট্রিং চান, আপনার decodeএটি দরকার । কল করা প্রক্রিয়াটি ধরে নেওয়া একটি ইউটিএফ-8-এনকোডযুক্ত স্ট্রিং প্রদান করে:
>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
এটি সমস্তই ওয়ান-লাইনারে সংকুচিত হতে পারে:
>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
আপনি যদি প্রক্রিয়াটির ইনপুটটি পাস করতে চান তবে কী- ওয়ার্ড আর্গুমেন্টে stdinকোনও bytesবস্তুটি পাস করুন input:
>>> cmd = ['awk', 'length($0) > 5']
>>> input = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)
>>> result.stdout.decode('utf-8')
'foofoo\n'
আপনি পাস করার মাধ্যমে ত্রুটি ক্যাপচার করতে পারেন stderr=subprocess.PIPE(ক্যাপচারে result.stderr) বা stderr=subprocess.STDOUT( result.stdoutনিয়মিত আউটপুট সহ ক্যাপচার )। যখন সুরক্ষা কোনও উদ্বেগের বিষয় নয়, আপনি shell=Trueনীচের নোটগুলিতে বর্ণিত হিসাবে পাস করে আরও জটিল শেল কমান্ড পরিচালনা করতে পারেন ।
জিনিসগুলি করার পুরানো পদ্ধতির তুলনায় এটি কিছুটা জটিলতা যুক্ত করে। তবে আমি মনে করি এটি পরিশোধের পক্ষে মূল্যবান: এখন আপনি runকেবলমাত্র ফাংশনটি নিয়ে যা করতে হবে তা করতে পারেন ।
পাইথনের পুরানো সংস্করণ (২.7-৩.৪): check_output
আপনি যদি পাইথনের একটি পুরানো সংস্করণ ব্যবহার করছেন, বা সামান্য পিছনে সামঞ্জস্যের প্রয়োজন হয়, আপনি সম্ভবত check_outputউপরে সংক্ষেপে বর্ণিত হিসাবে ফাংশনটি ব্যবহার করতে পারেন । পাইথন ২. 2. থেকে এটি উপলব্ধ।
subprocess.check_output(*popenargs, **kwargs)
এটি Popen(নীচে দেখুন) হিসাবে একই আর্গুমেন্ট নেয় এবং প্রোগ্রামটির আউটপুট সমেত একটি স্ট্রিং দেয়। এই উত্তরের শুরুতে আরও বিশদ ব্যবহারের উদাহরণ রয়েছে। পাইথন ৩.৫ এবং তার চেয়েও বড় ক্ষেত্রে check_outputএটি কার্যকর runকরা check=Trueএবং stdout=PIPEঠিক stdoutঅ্যাট্রিবিউট ফিরিয়ে দেওয়ার সমতুল্য ।
stderr=subprocess.STDOUTফিরে আসা আউটপুটটিতে ত্রুটি বার্তাগুলি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করতে আপনি পাস করতে পারেন - তবে পাইথনের কয়েকটি সংস্করণে পাস stderr=subprocess.PIPEকরার check_outputফলে ডেডলক হতে পারে । যখন সুরক্ষা কোনও উদ্বেগের বিষয় নয়, আপনি shell=Trueনীচের নোটগুলিতে বর্ণিত হিসাবে পাস করে আরও জটিল শেল কমান্ড পরিচালনা করতে পারেন ।
আপনি যদি stderrপ্রক্রিয়াটি থেকে পাইপ বা ইনপুট পাস করার প্রয়োজন check_outputহয় তবে কাজটি শেষ হবে না। এক্ষেত্রে Popenনীচের উদাহরণগুলি দেখুন ।
জটিল অ্যাপ্লিকেশন এবং পাইথনের উত্তরাধিকার সংস্করণ (২.6 এবং নীচে): Popen
আপনার যদি গভীর পিছনের সামঞ্জস্যতা প্রয়োজন হয়, বা যদি সরবরাহের তুলনায় আপনার আরও পরিশীলিত কার্যকারিতা প্রয়োজন হয় তবে আপনাকে অবজেক্টগুলির check_outputসাথে সরাসরি কাজ করতে হবে Popen, যা উপ-প্রক্রিয়াগুলির জন্য নিম্ন-স্তরের এপিআইকে আবদ্ধ করে।
Popenকন্সট্রাকটর পারেন গ্রহণ একটি কমান্ডের আর্গুমেন্ট ছাড়া, অথবা একটি তালিকা তার প্রথম আইটেম হিসাবে কমান্ড যুক্তি যে কোন সংখ্যার তালিকা একটি পৃথক আইটেম হিসাবে প্রতিটি দ্বারা অনুসরণ রয়েছে। shlex.splitস্ট্রিংগুলি যথাযথভাবে ফর্ম্যাট করা তালিকায় পার্স করতে সহায়তা করতে পারে। প্রক্রিয়া আইও পরিচালনা এবং নিম্ন-স্তরের কনফিগারেশনের জন্য Popenঅবজেক্টগুলি বিভিন্ন আর্গুমেন্টও গ্রহণ করে ।
ইনপুট এবং ক্যাপচার আউটপুট প্রেরণ, communicateপ্রায় সবসময় পছন্দসই পদ্ধতি। যেমন:
output = subprocess.Popen(["mycmd", "myarg"],
stdout=subprocess.PIPE).communicate()[0]
অথবা
>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo
আপনি সেট করেন তাহলে stdin=PIPE, communicateএছাড়াও আপনি মাধ্যমে প্রক্রিয়া তথ্য প্রেরণ করতে পারবেন stdin:
>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
... stderr=subprocess.PIPE,
... stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo
নোট হারুন হলের উত্তর , যা নির্দেশ করে কিছু সিস্টেমে, আপনি সেট করার প্রয়োজন হতে পারে stdout, stderrএবং stdinসব থেকে PIPE(অথবা DEVNULL) পেতে communicateকাজ সব সময়ে।
কিছু বিরল ক্ষেত্রে আপনার জটিল, রিয়েল-টাইম আউটপুট ক্যাপচারের প্রয়োজন হতে পারে। ভার্টেকের উত্তরটি সামনের দিকে এগিয়ে যাওয়ার উপায় নির্দেশ করে, তবে communicateসাবধানতার সাথে ব্যবহার না করা হলে অন্যান্য পদ্ধতিগুলি অচলাবস্থার ঝুঁকির মধ্যে রয়েছে।
উপরের সমস্ত ফাংশনগুলির মতো, যখন সুরক্ষা কোনও উদ্বেগের বিষয় নয়, আপনি পাশ দিয়ে আরও জটিল শেল কমান্ড চালাতে পারেন shell=True।
মন্তব্য
1. চালানো শেল কমান্ড: shell=Trueযুক্তি
সাধারণত, এর প্রতিটি কলের run, check_outputঅথবা Popenকন্সট্রাকটর একটি executes একক কর্মসূচি । এর অর্থ কোনও অভিনব বাশ-স্টাইলের পাইপ নেই। আপনি যদি জটিল শেল কমান্ডগুলি চালাতে চান তবে আপনি পাস করতে পারেন shell=True, যা তিনটি ফাংশনই সমর্থন করে।
তবে, এটি করা সুরক্ষা উদ্বেগ উত্থাপন করে । আপনি যদি হালকা স্ক্রিপ্টিংয়ের চেয়ে আরও কিছু করে থাকেন তবে আপনি প্রতিটি প্রক্রিয়া আলাদাভাবে কল করা এবং প্রতিটি থেকে আউটপুটটিকে পরবর্তী ইনপুট হিসাবে পাস করার মাধ্যমে ভাল করতে পারেন via
run(cmd, [stdout=etc...], input=other_output)
অথবা
Popen(cmd, [stdout=etc...]).communicate(other_output)
পাইপগুলিকে সরাসরি সংযুক্ত করার লোভ প্রবল; এটি প্রতিহত করুন। অন্যথায়, আপনি সম্ভবত ডেডলকগুলি দেখতে পাবেন বা এই জাতীয় কিছু করতে হবে ।
2. ইউনিকোড বিবেচনা
check_outputপাইথন 2 এ স্ট্রিং দেয়, কিন্তু পাইথন 3-এ একটি bytesঅবজেক্ট un আপনি যদি ইতিমধ্যে না থাকেন তবে ইউনিকোড সম্পর্কে জানতে কিছুটা সময় নেওয়া উচিত ।