কিভাবে সাবপ্রসেস রান পদ্ধতি ব্যবহার করে পাইথনে শেল কমান্ড এক্সিকিউট করবেন

How Execute Shell Commands Python Using Subprocess Run Method



সাবপ্রসেস একটি অন্তর্নির্মিত পাইথন মডিউল যা নতুন প্রক্রিয়া তৈরি করতে এবং তাদের ইনপুট এবং আউটপুট ডেটা স্ট্রীমের সাথে যোগাযোগ করতে ব্যবহার করা যেতে পারে। সহজ ভাষায়, আপনি এটি ব্যবহার করতে পারেন শেল কমান্ড চালানোর জন্য এবং এক্সিকিউটেবল বাইনারিগুলি সাধারণত একটি লিনাক্স ফাইল সিস্টেম জুড়ে বিভিন্ন বিন ফোল্ডারে ছড়িয়ে ছিটিয়ে থাকে। আপনি একটি এক্সিকিউটেবল বাইনারিতে একটি সম্পূর্ণ পথ সরবরাহ করতে পারেন এবং বাইনারির সাথে যুক্ত কোন কমান্ড-লাইন সুইচ ব্যবহার করতে পারেন। এই নিবন্ধটি ব্যাখ্যা করবে কিভাবে পাইপথন অ্যাপসে সাবপ্রসেস মডিউল এবং এর রান পদ্ধতি ব্যবহার করতে হয়। নিবন্ধের সমস্ত কোড নমুনা উবুন্টু 20.04 এ পাইথন 3.8.2 দিয়ে পরীক্ষা করা হয়েছে।

Subprocess.run পদ্ধতি

Subprocess.run পদ্ধতি যুক্তিগুলির একটি তালিকা নেয়। যখন পদ্ধতিটি বলা হয়, এটি কমান্ডটি কার্যকর করে এবং প্রক্রিয়াটি শেষ হওয়ার জন্য অপেক্ষা করে, শেষ পর্যন্ত একটি সম্পূর্ণ প্রক্রিয়াকরণ বস্তুটি ফিরিয়ে দেয়। CompletedProcess অবজেক্টটি stdout, stderr, মেথড কল করার সময় ব্যবহৃত আসল আর্গুমেন্ট এবং রিটার্ন কোড প্রদান করে। Stdout কমান্ড দ্বারা উত্পাদিত ডেটা স্ট্রিমকে বোঝায়, যখন stderr প্রোগ্রাম চালানোর সময় উত্থাপিত কোন ত্রুটি বোঝায়। যে কোন অ-শূন্য রিটার্ন কোড (প্রস্থান কোড) মানে subprocess.run পদ্ধতিতে চালানো কমান্ডের ত্রুটি।







উদাহরণ 1: Subprocess.run পদ্ধতি ব্যবহার করে একটি টেক্সট ফাইলের আউটপুট কন্টেন্ট

নিচের কমান্ডটি একটি data.txt ফাইলের বিষয়বস্তু আউটপুট করবে, ধরে নিচ্ছি যে এতে একটি নাম = জন স্ট্রিং রয়েছে।



আমদানি উপপ্রক্রিয়া
উপপ্রক্রিয়াদৌড়(['বিড়াল', 'data.txt'])

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট ফিরে আসবে:



নাম=জন
সম্পন্ন প্রক্রিয়া(যুক্তি=['বিড়াল', 'data.txt'],রিটার্ন কোড=0)

লিস্ট আর্গুমেন্টের প্রথম উপাদান হল কার্যকর করা কমান্ডের নাম। তালিকার যে কোন উপাদানই প্রথম উপাদান অনুসরণ করে সেগুলোকে কমান্ড-লাইন অপশন বা সুইচ হিসেবে বিবেচনা করা হয়। বিকল্পগুলি সংজ্ঞায়িত করতে আপনি একক ড্যাশ এবং ডাবল ড্যাশ ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি ডিরেক্টরিতে ফাইল এবং ফোল্ডার তালিকাভুক্ত করার জন্য, কোডটি হবে subprocess.run ([ls, -l]। এই ক্ষেত্রে বেশিরভাগ ক্ষেত্রে, আপনি শেল কমান্ডের কোনো স্পেস -বিচ্ছিন্ন যুক্তিকে একটি পৃথক উপাদান হিসেবে বিবেচনা করতে পারেন subprocess.run পদ্ধতিতে সরবরাহকৃত তালিকা।





উদাহরণ 2: Subprocess.run পদ্ধতির আউটপুট দমন করুন

Subprocess.run পদ্ধতির আউটপুট দমন করতে, আপনাকে অতিরিক্ত যুক্তি হিসেবে stdout = subprocess.DEVNULL এবং stderr = subprocess.DEVNULL সরবরাহ করতে হবে।

আমদানি উপপ্রক্রিয়া

উপপ্রক্রিয়াদৌড়(['বিড়াল', 'data.txt'],stdout=উপপ্রক্রিয়াবিকাশ,
stderr=উপপ্রক্রিয়াবিকাশ)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:



সম্পূর্ণ প্রক্রিয়া

উদাহরণ 3: Subprocess.run পদ্ধতির আউটপুট ক্যাপচার করুন

Subprocess.run পদ্ধতির আউটপুট ক্যাপচার করতে, ক্যাপচার_আউটপুট = ট্রু নামে একটি অতিরিক্ত যুক্তি ব্যবহার করুন।

আমদানি উপপ্রক্রিয়া
আউটপুট= উপপ্রক্রিয়াদৌড়(['বিড়াল', 'data.txt'],ক্যাপচার_আউটপুট=সত্য)
ছাপা (আউটপুট)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:

সম্পন্ন প্রক্রিয়া(যুক্তি=['বিড়াল', 'data.txt'],রিটার্ন কোড=0,
stdout='নাম = জনn',stderr='')

আপনি output.stdout এবং output.stderr পদ্ধতি ব্যবহার করে পৃথকভাবে stdout এবং stderr মান অ্যাক্সেস করতে পারেন। আউটপুট একটি বাইট ক্রম হিসাবে উত্পাদিত হয়। আউটপুট হিসাবে একটি স্ট্রিং পেতে, output.stdout.decode (utf-8) পদ্ধতি ব্যবহার করুন। আপনি স্ট্রিং ফরম্যাটে আউটপুট পেতে subprocess.run কলের অতিরিক্ত যুক্তি হিসেবে টেক্সট = ট্রুও সরবরাহ করতে পারেন। প্রস্থান অবস্থা কোড পেতে, আপনি output.returncode পদ্ধতি ব্যবহার করতে পারেন।

উদাহরণ 4: Subprocess.run পদ্ধতি দ্বারা সম্পাদিত কমান্ডের ব্যর্থতায় ব্যতিক্রম বাড়ান

একটি ব্যতিক্রম উত্থাপন করার জন্য যখন কমান্ডটি শূন্যহীন অবস্থার সাথে প্রস্থান করে, চেক = সত্য যুক্তি ব্যবহার করুন।

আমদানি উপপ্রক্রিয়া
উপপ্রক্রিয়াদৌড়(['বিড়াল', 'data.tx'],ক্যাপচার_আউটপুট=সত্য,পাঠ্য=সত্য,চেক=সত্য)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:

CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Command '[' cat ',' data.tx ']'
অ-শূন্য প্রস্থান অবস্থা ফিরে এসেছে 1।

উদাহরণ 5: Subprocess.run মেথড দ্বারা এক্সিকিউটেড কমান্ড টু স্ট্রিং পাস করুন

আপনি ইনপুট = 'স্ট্রিং' যুক্তি ব্যবহার করে subprocess.run পদ্ধতি দ্বারা চালানো কমান্ডে একটি স্ট্রিং পাস করতে পারেন।

আমদানি উপপ্রক্রিয়া
আউটপুট= উপপ্রক্রিয়াদৌড়(['বিড়াল'], ইনপুট='data.txt',ক্যাপচার_আউটপুট=সত্য,
পাঠ্য=সত্য,চেক=সত্য)
ছাপা (আউটপুট)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:

সম্পূর্ণ প্রসেস (args = ['cat'], returncode = 0, stdout = 'data.txt', stderr = '')

আপনি দেখতে পাচ্ছেন, উপরের কোডটি একটি স্ট্রিং হিসাবে data.txt পাস করে এবং ফাইল অবজেক্ট হিসাবে নয়। একটি ফাইল হিসাবে data.txt পাস করতে, stdin যুক্তি ব্যবহার করুন।

সঙ্গে খোলা('data.txt') হিসাবেচ:
আউটপুট= উপপ্রক্রিয়াদৌড়(['বিড়াল'],stdin=,ক্যাপচার_আউটপুট=সত্য,
পাঠ্য=সত্য,চেক=সত্য)
ছাপা (আউটপুট)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:

সম্পূর্ণ প্রক্রিয়া

উদাহরণ 6: Subprocess.run পদ্ধতি ব্যবহার করে সরাসরি শেলের মধ্যে কমান্ড চালান

প্রধান কমান্ডে স্ট্রিং স্প্লিট এবং এটি অনুসরণকারী বিকল্পগুলি ব্যবহার না করে সরাসরি একটি শেলের মধ্যে একটি কমান্ড চালানো সম্ভব। এটি করার জন্য, আপনাকে অবশ্যই অতিরিক্ত যুক্তি হিসেবে শেল = ট্রু পাস করতে হবে। তবে, পাইথন ডেভেলপারদের দ্বারা শেল = ট্রু ব্যবহার করে নিরুৎসাহিত করা হলে নিরাপত্তার সমস্যা দেখা দিতে পারে। আপনি থেকে নিরাপত্তা প্রভাব সম্পর্কে আরও পড়তে পারেন এখানে

আমদানি উপপ্রক্রিয়া
উপপ্রক্রিয়াদৌড়('cat' data.txt '',শেল=সত্য)

উপরের কোডটি চালালে নিম্নলিখিত আউটপুট তৈরি হবে:

নাম = জন

উপসংহার

পাইথনে subprocess.run পদ্ধতি বেশ শক্তিশালী, কারণ এটি আপনাকে পাইথনের মধ্যেই শেল কমান্ড চালাতে দেয়। এটি পৃথক ফাইলে অতিরিক্ত শেল স্ক্রিপ্ট কোডের প্রয়োজন ছাড়াই সমস্ত কোডকে পাইথনে সীমাবদ্ধ করতে সহায়তা করে। যাইহোক, এটি একটি পাইথন তালিকায় শেল কমান্ডগুলি সঠিকভাবে টোকেনাইজ করা বেশ জটিল হতে পারে। আপনি সাধারণ শেল কমান্ডগুলিকে টোকেনাইজ করার জন্য shlex.split () পদ্ধতি ব্যবহার করতে পারেন, কিন্তু দীর্ঘ, জটিল কমান্ডগুলিতে - বিশেষ করে যারা পাইপ চিহ্ন রয়েছে - শ্লেক্স কমান্ডটি সঠিকভাবে বিভক্ত করতে ব্যর্থ হয়। এই ক্ষেত্রে, ডিবাগিং একটি জটিল সমস্যা হতে পারে। আপনি এড়াতে শেল = সত্য যুক্তি ব্যবহার করতে পারেন, কিন্তু এই কর্মের সাথে যুক্ত কিছু নিরাপত্তা উদ্বেগ রয়েছে।