मैं एक प्रक्रिया (विशेष रूप से iChat) को मारने की कोशिश कर रहा हूं। कमांड लाइन पर, मैं इन कमांड का उपयोग करता हूं:
ps -A | grep iChat
फिर:
kill -9 PID
हालाँकि, मुझे यकीन नहीं है कि इन आदेशों का अनुवाद पायथन से कैसे किया जाए।
जवाबों:
मान लें कि आप यूनिक्स जैसे प्लेटफॉर्म पर हैं (ताकि वह ps -A
मौजूद हो),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
आपको चर (एक स्ट्रिंग) ps -A
में आउटपुट देता है out
। आप इसे लाइनों में तोड़ सकते हैं और उन पर लूप कर सकते हैं ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(आप आयात करने से बच सकते हैं signal
, और 9
इसके बजाय उपयोग कर सकते हैं signal.SIGKILL
, लेकिन मैं केवल उस शैली को विशेष रूप से पसंद नहीं करता हूं, इसलिए मैं इस तरह नामित नाम का उपयोग करना चाहता हूं)।
बेशक आप इन पंक्तियों पर बहुत अधिक परिष्कृत प्रसंस्करण कर सकते हैं, लेकिन यह इस बात की नकल करता है कि आप शेल में क्या कर रहे हैं।
यदि आप इसके बाद से बच रहे हैं ps
, तो यह अलग-अलग यूनिक्स जैसी प्रणालियों में करना मुश्किल है ( ps
एक अर्थ में, प्रक्रिया सूची प्राप्त करने के लिए उनका सामान्य एपीआई है)। लेकिन अगर आपके पास एक विशिष्ट यूनिक्स जैसी प्रणाली है, तो केवल (किसी भी क्रॉस-प्लेटफॉर्म पोर्टेबिलिटी की आवश्यकता नहीं है), यह संभव हो सकता है; विशेष रूप से, लिनक्स पर, /proc
छद्म-फाइलसिस्टम बहुत मददगार है। इससे पहले कि हम इस उत्तरार्ध में मदद कर सकें, आपको अपनी सटीक आवश्यकताओं को स्पष्ट करना होगा।
psutil नाम से प्रक्रिया पा सकते हैं और इसे मार सकते हैं:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
पैकेज की आवश्यकता होती है , जो लक्ष्य मशीन पर मौजूद नहीं हो सकता है।
यदि आपको क्रॉस-प्लेटफ़ॉर्म होने के लिए विंडोज केस पर विचार करना है, तो निम्नलिखित प्रयास करें:
os.system('taskkill /f /im exampleProcess.exe')
यदि आपके पास हत्या है:
os.system("killall -9 iChat");
या:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, हालांकि मुझे लगता है कि मैं दुनिया का एकमात्र व्यक्ति हूं जो इसके बजाय इसका उपयोग करता हैkillall
killall java
?
pkill
क्योंकि केवल killall
मैं ही जानता था कि "सब कुछ मार डालो"।
आप यह कोशिश कर सकते हैं। लेकिन इससे पहले कि आप का उपयोग कर psutil स्थापित करने की आवश्यकता हैsudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
आप उपयोग कर सकते हैं pkill <process_name>
नाम से प्रक्रिया को मारने के लिए एक यूनिक्स प्रणाली में ।
फिर अजगर कोड होगा:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
यदि आप किसी विशेष शीर्षक (ओं) को ले जाने की प्रक्रिया (तों) या cmd.exe को मारना चाहते हैं।
import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]
# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
for title in titles:
if title in line['Window Title']:
print line['Window Title']
PIDList.append(line['PID'])
# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
os.system('taskkill /pid ' + id )
आशा करता हूँ की ये काम करेगा। उनके कई बेहतर समाधान मेरे लिए हो सकते हैं।
मेरे लिए केवल एक चीज है जो काम करती है:
उदाहरण के लिए
import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
import os, signal
def check_kill_process(pstring):
for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
fields = line.split()
pid = fields[0]
os.kill(int(pid), signal.SIGKILL)
एलेक्स मार्टेली जवाब पायथन 3 में काम नहीं करेगा क्योंकि out
एक बाइट्स ऑब्जेक्ट होगा और इस प्रकार TypeError: a bytes-like object is required, not 'str'
जब परीक्षण होगाif 'iChat' in line:
।
सबप्रोसेस प्रलेखन से उद्धरण :
संचार () एक टपल लौटाता है (stdout_data, stderr_data)। यदि पाठ मोड में स्ट्रीम खोले गए हैं तो डेटा तार होगा; अन्यथा, बाइट्स।
पायथन 3 के लिए, यह text=True
(> = पायथन 3.7) या निर्माता से universal_newlines=True
तर्क जोड़कर हल किया जाता है Popen
। out
फिर एक स्ट्रिंग ऑब्जेक्ट के रूप में लौटाया जाएगा।
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line:
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
वैकल्पिक रूप से, आप बाइट्स के डिकोड () विधि का उपयोग करके एक स्ट्रिंग बना सकते हैं।
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line.decode('utf-8'):
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)