আমি ব্যবহার করতে চান subprocess.check_output()সঙ্গে ps -A | grep 'process_name'। আমি বিভিন্ন সমাধান চেষ্টা করেছিলাম তবে এখনও কিছুই কার্যকর হয়নি। কেউ আমাকে কীভাবে এটি পরিচালনা করতে পারেন?
আমি ব্যবহার করতে চান subprocess.check_output()সঙ্গে ps -A | grep 'process_name'। আমি বিভিন্ন সমাধান চেষ্টা করেছিলাম তবে এখনও কিছুই কার্যকর হয়নি। কেউ আমাকে কীভাবে এটি পরিচালনা করতে পারেন?
উত্তর:
subprocessমডিউল সহ পাইপ ব্যবহার করতে আপনাকে পাস করতে হবে shell=True।
তবে এটি বিভিন্ন কারণে সত্যই পরামর্শযোগ্য নয়, এর মধ্যে কমপক্ষে সুরক্ষাও নয়। পরিবর্তে, পৃথকভাবে psএবং grepপ্রক্রিয়াগুলি তৈরি করুন এবং আউটপুটটিকে এক থেকে অন্যটিতে পাইপ করুন, এর মতো:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
আপনার নির্দিষ্ট ক্ষেত্রে, তবে, সহজ সমাধানটি কল করা subprocess.check_output(('ps', '-A'))এবং তারপরে str.findআউটপুট।
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1অর্থ হ'ল গ্রেপ দ্বারা কিছুই পাওয়া যায় নি, তাই এটি স্বাভাবিক আচরণ।
ps.wait()আমাদের ইতিমধ্যে যখন আউটপুট থাকবে তখন আমাদের কেন দরকার । ps.wait.__doc__সন্তানের অবসান হওয়ার জন্য অপেক্ষা করে তবে সন্তানের বিষয়বস্তুটি ইতিমধ্যে outputভেরিয়েবলের মধ্যে ফেলেছে বলে মনে হচ্ছে
string.findযা পক্ষে অবচিত হয়েছে, str.find(অর্থাত, পদ্ধতি findউপর strবস্তু)।
grepঅকাল মারা গেলে; psযদি এটির ওএস পাইপ বাফারটি পূরণ করার জন্য পর্যাপ্ত আউটপুট উত্পাদন করে তবে আপনি অনির্দিষ্টকালের জন্য স্তব্ধ হয়ে যেতে পারেন (কারণ আপনি ps.stdout.close()পিতামাতাকে ডাকেন নি )। এটি এড়াতে শুরু করার আদেশটি অদলবদল করুন
অথবা আপনি সর্বদা সাব-প্রসেস অবজেক্টগুলিতে যোগাযোগ পদ্ধতিটি ব্যবহার করতে পারেন।
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
যোগাযোগ পদ্ধতিটি স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটির একটি দ্বিগুণ দেয়।
communicateচেয়ে ভাল wait। এই ধরনের সতর্কতা রয়েছে: "stdout = PIPE এবং / অথবা stderr = PIPE ব্যবহার করার সময় এটি অচল হয়ে যাবে এবং শিশু প্রক্রিয়াটি কোনও পাইপে পর্যাপ্ত আউটপুট উত্পন্ন করে যে এটি ওএস পাইপ বাফারকে আরও ডেটা গ্রহণ করার জন্য অপেক্ষা করতে অবরুদ্ধ করে to এড়িয়ে চলুন। "
: ব্যবহার করে একটি পাইপলাইন স্থাপনের উপর subprocess ডকুমেন্টেশন দেখুন http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
আমি নিম্নলিখিত কোড উদাহরণটি পরীক্ষা করি নি তবে এটি আপনি যা চান মোটামুটি হওয়া উচিত:
query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]
জেএলাভিস দ্রবণটি ভাল, তবে আমি শেল = সত্যের পরিবর্তে শ্লেক্স ব্যবহারের উন্নতি যুক্ত করব। নীচে আমি জিজ্ঞাসার সময় গ্রেপ আউট
#!/bin/python
import subprocess
import shlex
cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)