এখানে অন্যান্য উত্তরগুলি যথাযথভাবে সুরক্ষা ক্যাভেটগুলি ব্যাখ্যা করে যা subprocess
ডকুমেন্টেশনেও উল্লেখ করা হয়েছে । তবে এগুলি ছাড়াও, আপনি যে প্রোগ্রামটি চালাতে চান তা শুরু করার জন্য একটি শেল শুরু করার ওভারহেড প্রায়শই অপ্রয়োজনীয় এবং স্পষ্টভাবে নির্বোধ যে পরিস্থিতিতে আপনি শেলের কার্যকারিতা কোনওই ব্যবহার করেন না of তদুপরি, অতিরিক্ত লুকানো জটিলতা আপনাকে ভয় দেখাবে, বিশেষত যদি আপনি শেল বা এটি সরবরাহ করে এমন পরিষেবার সাথে খুব বেশি পরিচিত না হন।
যেখানে শেলের সাথে ইন্টারঅ্যাকশনগুলি অনানুষ্ঠানিক, সেখানে পাইথন এবং শেল স্ক্রিপ্ট উভয়ই বোঝার জন্য আপনাকে পাইথন স্ক্রিপ্টটির পাঠক এবং রক্ষণাবেক্ষণকারী (যা আপনার ভবিষ্যতের স্ব হতে পারে বা নাও হতে পারে) প্রয়োজন। মনে রাখবেন পাইথন মূলমন্ত্রটি "স্পষ্ট বর্ণের চেয়ে সুস্পষ্ট"; এমনকি যখন পাইথন কোডটি সমতুল্য (এবং প্রায়শই খুব সংক্ষিপ্ত) শেল স্ক্রিপ্টের চেয়ে কিছুটা জটিল হতে চলেছে, আপনি শেলটি সরিয়ে ফাংশনটির পরিবর্তে দেশীয় পাইথন কনস্ট্রাক্টের সাথে আরও ভাল ব্যবহার করতে পারেন। বাহ্যিক প্রক্রিয়াতে করা কাজকে কম করা এবং যতদূর সম্ভব আপনার নিজের কোডের মধ্যে নিয়ন্ত্রণ রাখা প্রায়শই ভাল ধারণা কেবল কারণ এটি দৃশ্যমানতার উন্নতি করে এবং অবাঞ্ছিত - পার্শ্ব প্রতিক্রিয়াগুলির ঝুঁকি হ্রাস করে।
ওয়াইল্ডকার্ড সম্প্রসারণ, ভেরিয়েবল ইন্টারপোলেশন এবং পুনঃনির্দেশ সমস্ত দেশীয় পাইথন কনস্ট্রাক্টসগুলির সাথে প্রতিস্থাপন করা সহজ। পাইথনের একটি জটিল শেল পাইপলাইন যেখানে পাইথনগুলিতে অংশগুলি বা সমস্ত যুক্তিসঙ্গতভাবে পুনরায় লেখা যায় না এমন এক পরিস্থিতি হতে পারে যেখানে আপনি শেলটি ব্যবহারের বিষয়টি বিবেচনা করতে পারেন। আপনার এখনও পারফরম্যান্স এবং সুরক্ষা সম্পর্কিত প্রভাবগুলি নিশ্চিত হওয়া উচিত make
তুচ্ছ ক্ষেত্রে এড়াতে shell=True
, কেবল প্রতিস্থাপন করুন
subprocess.Popen("command -with -options 'like this' and\\ an\\ argument", shell=True)
সঙ্গে
subprocess.Popen(['command', '-with','-options', 'like this', 'and an argument'])
লক্ষ্য করুন যে প্রথম আর্গুমেন্টটি স্ট্রিংগুলিতে execvp()
কীভাবে পাস হবে তার তালিকা এবং কিভাবে স্ট্রিং এবং ব্যাকস্ল্যাশ-এস্কেডিং শেল মেটাচার্যাক্টরগুলি উদ্ধৃত করা সাধারণত প্রয়োজন হয় না (বা দরকারী, বা সঠিক)। সম্ভবত আরও দেখুন কখন শেল ভেরিয়েবলের চারপাশে উদ্ধৃতিগুলি लपेटতে হয়?
একদিকে যেমন, আপনি প্যাকেজটির Popen
সরল subprocess
মোড়কের মধ্যে কেউ যদি চান তা করেন তবে আপনি প্রায়শই এড়াতে চান। আপনার যদি সাম্প্রতিক পর্যায়ে পাইথন থাকে তবে আপনার সম্ভবত ব্যবহার করা উচিত subprocess.run
।
check=True
এটির সাথে ব্যর্থ হবে যদি আপনি চালিত আদেশটি ব্যর্থ হয়।
- সঙ্গে
stdout=subprocess.PIPE
কম্যান্ড এর আউটপুট গ্রহণ হবে।
- কিছুটা অস্পষ্টভাবে,
universal_newlines=True
এটির সাথে সঠিক ইউনিকোড স্ট্রিংয়ের আউটপুট ডিকোড হবে (এটি bytes
পাইথন 3 এ অন্যথায় সিস্টেমের এনকোডিংয়ের মধ্যে রয়েছে)।
যদি তা না হয় তবে অনেকগুলি কাজের জন্য, আপনি check_output
কোনও কমান্ড থেকে আউটপুট পেতে চান , এটি সফল হয়েছে কিনা তা পরীক্ষা করে নেওয়া হয়, বা check_call
সংগ্রহের জন্য কোনও আউটপুট না থাকলে।
আমি ডেভিড কর্নের একটি উদ্ধৃতি দিয়ে বন্ধ করব: "পোর্টেবল শেল স্ক্রিপ্টের চেয়ে পোর্টেবল শেলটি লেখা সহজ" " এমনকি subprocess.run('echo "$HOME"', shell=True)
উইন্ডোজ পোর্টেবল হয় না।
-l
পাস করা হয়েছে যদি । স্ট্রিং আর্গুমেন্ট বেশিরভাগ ক্ষেত্রে তালিকার পরিবর্তে ব্যবহার করা উচিত ।/bin/sh
ls
shell=True
shell=True