এই প্রশ্নের উত্তরটি আপনি ব্যবহার করছেন পাইথনের সংস্করণে 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 আপনি যদি ইতিমধ্যে না থাকেন তবে ইউনিকোড সম্পর্কে জানতে কিছুটা সময় নেওয়া উচিত ।