পাইপের সাহায্যে কীভাবে `সাবপ্রসেস` কমান্ডটি ব্যবহার করবেন


246

আমি ব্যবহার করতে চান subprocess.check_output()সঙ্গে ps -A | grep 'process_name'। আমি বিভিন্ন সমাধান চেষ্টা করেছিলাম তবে এখনও কিছুই কার্যকর হয়নি। কেউ আমাকে কীভাবে এটি পরিচালনা করতে পারেন?



4
psutilএকটি পোর্টেবল পদ্ধতিতে প্রক্রিয়া তথ্য পেতে অনুমতি দেয় যে আছে ।
jfs

উত্তর:


439

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আউটপুট।


81
ব্যবহার এড়াতে আউটপুট / ইনপুট পৃথক করার জন্য +1shell=True
নিকোলাস

5
ভুলে যাবেন না, ত্রুটির subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1অর্থ হ'ল গ্রেপ দ্বারা কিছুই পাওয়া যায় নি, তাই এটি স্বাভাবিক আচরণ।
সার্জ

2
ps.wait()আমাদের ইতিমধ্যে যখন আউটপুট থাকবে তখন আমাদের কেন দরকার । ps.wait.__doc__সন্তানের অবসান হওয়ার জন্য অপেক্ষা করে তবে সন্তানের বিষয়বস্তুটি ইতিমধ্যে outputভেরিয়েবলের মধ্যে ফেলেছে বলে মনে হচ্ছে
পাপুচে গিন্সিলিনজিনহো

3
@MakisH আপনি খুঁজছেন string.findযা পক্ষে অবচিত হয়েছে, str.find(অর্থাত, পদ্ধতি findউপর strবস্তু)।
তাইমন 21

4
দ্রষ্টব্য: grepঅকাল মারা গেলে; psযদি এটির ওএস পাইপ বাফারটি পূরণ করার জন্য পর্যাপ্ত আউটপুট উত্পাদন করে তবে আপনি অনির্দিষ্টকালের জন্য স্তব্ধ হয়ে যেতে পারেন (কারণ আপনি ps.stdout.close()পিতামাতাকে ডাকেন নি )। এটি এড়াতে শুরু করার আদেশটি অদলবদল করুন
jfs

54

অথবা আপনি সর্বদা সাব-প্রসেস অবজেক্টগুলিতে যোগাযোগ পদ্ধতিটি ব্যবহার করতে পারেন।

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)

যোগাযোগ পদ্ধতিটি স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটির একটি দ্বিগুণ দেয়।


3
আমি মনে করি ব্যবহার করার communicateচেয়ে ভাল waitএই ধরনের সতর্কতা রয়েছে: "stdout = PIPE এবং / অথবা stderr = PIPE ব্যবহার করার সময় এটি অচল হয়ে যাবে এবং শিশু প্রক্রিয়াটি কোনও পাইপে পর্যাপ্ত আউটপুট উত্পন্ন করে যে এটি ওএস পাইপ বাফারকে আরও ডেটা গ্রহণ করার জন্য অপেক্ষা করতে অবরুদ্ধ করে to এড়িয়ে চলুন। "
পাওলো

2
উপরোক্ত পাওলোর মন্তব্য স্পষ্ট করার জন্য, সতর্কতাটি অপেক্ষা করার জন্য, যোগাযোগের জন্য নয় - অর্থাত্ তিনি বলছেন যে যোগাযোগটি আরও ভাল।
এনিমিবাগজোনস

23

: ব্যবহার করে একটি পাইপলাইন স্থাপনের উপর 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]

2
এটি ব্যর্থ হয়েছে তা যাচাই করার পরে, টমনের নীচের উত্তরটি এমন কোনও কিছুর জন্য দেখুন যা উপহাস না করে কাজ করে
অ্যালভিন

2
সাবপ্রোসেস.সেক_আউটপুট পাইথন ২.6.৯
তে

6

জেএলাভিস দ্রবণটি ভাল, তবে আমি শেল = সত্যের পরিবর্তে শ্লেক্স ব্যবহারের উন্নতি যুক্ত করব। নীচে আমি জিজ্ঞাসার সময় গ্রেপ আউট

#!/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)

1
খোলের ওপরে শেলেক্স কেন?
এএফপি_৫৫৫

2
এখানে শ্লেক্স কোথায় ব্যবহৃত হয়?
3lokh

4

এছাড়াও, 'pgrep'পরিবর্তে কমান্ড ব্যবহার করার চেষ্টা করুন'ps -A | grep 'process_name'


2
আপনি যদি প্রক্রিয়া আইডি পেতে চান তবে অবশ্যই
শুই

3

আপনি sh.py এ পাইপের কার্যকারিতা চেষ্টা করতে পারেন :

import sh
print sh.grep(sh.ps("-ax"), "process_name")

-1

পাইথন 3.5 এর পরে আপনি এটি ব্যবহার করতে পারেন:

    import subprocess

    f = open('test.txt', 'w')
    process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
    f.write(process.stdout)
    f.close()

কমান্ডটি কার্যকর করা অবরুদ্ধ এবং আউটপুটটি প্রসেসডস্টাউটে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.