Moin,
ich bin kompletter Neuling in Python. Ich schreibe hier, weil ich für meinen HTPC ein kleines Script benötige, dass mir einen bestimmten Task killt. Mehr soll es eigentlich auch nicht tun.
Ist so etwas schwierig zu realisieren, weil man noch irgendwelchen Dinge importieren muss oder würde das von Haus aus gehen?
Grüße
Task killen mit Python
Welches Betriebssystem setzt du ein? Unter Linux reicht ein subprocess.Popen() mit dem kill-Befehl, passende Rechte einmal vorausgesetzt.bullrin hat geschrieben:ich bin kompletter Neuling in Python. Ich schreibe hier, weil ich für meinen HTPC ein kleines Script benötige, dass mir einen bestimmten Task killt.
hi,
ich benutze Windows 7 und habe mich gestern noch ein wenig mit Python beschäftigt. Ich habe jetzt ein Python Plugin für Notepad++.
Nach etwas googlen bin ich auf folgenden Code gestoßen:
Ich wollte den Code mit n++ dann ausführen, aber irgendwie gab es nur Fehler:
Grüße
ich benutze Windows 7 und habe mich gestern noch ein wenig mit Python beschäftigt. Ich habe jetzt ein Python Plugin für Notepad++.
Nach etwas googlen bin ich auf folgenden Code gestoßen:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2008 Jens Kadenbach <j.kadenbach@gmx.de>
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.
from __future__ import with_statement
import os
import signal
from os import path
from collections import defaultdict
def get_processes():
for d in os.listdir('/proc'):
try:
with open(path.join('/', 'proc', d, 'status'), 'r') as status:
data = defaultdict(list)
for line in status:
name, value = line.split(':')
data[name.lower()].append(value.strip())
yield map(' '.join, (data['name'], data['pid']))
except IOError:
pass
def killall(process_name):
for pid in (pid for name, pid in get_processes()
if name == process_name):
os.kill(int(pid), signal.SIGTERM)
if __name__ == '__main__':
for name, pid in get_processes():
print name, pid
killall(raw_input("Prozesse mit folgendem Namen killen: "))
Ich wollte den Code mit n++ dann ausführen, aber irgendwie gab es nur Fehler:
Was ist da los? Müsste in der Konsole nicht eine Eingabe erfolgen, welchen Task ich killen möchte?Traceback (most recent call last):
File "C:\Users\Daniel\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\taskk.py", line 37, in <module>
for name, pid in get_processes():
File "C:\Users\Daniel\AppData\Roaming\Notepad++\plugins\Config\PythonScript\scripts\taskk.py", line 19, in get_processes
for d in os.listdir('/proc'):
WindowsError: [Error 3] Das System kann den angegebenen Pfad nicht finden: '/proc/*.*'
Grüße
Rate mal !
Unter Windows gibt es kein Verzeichnis names "/proc", in welchem die Prozesse gelistet sind. Dieser Script funktioniert nur unter unixoiden Betriebsystemen.
Unter Windows gibt es kein Verzeichnis names "/proc", in welchem die Prozesse gelistet sind. Dieser Script funktioniert nur unter unixoiden Betriebsystemen.
@Xynon1: Genau genommen erst einmal nur unter Linux und möglicherweise ein paar anderen Unix-Derivaten. "/proc/" ist nicht standardisiert.
Habe aber leider keinen Überblick über alle unixoiden Betriebsysteme, mit Sicherheit gibt es auch ein/zwei Linux-Systeme die kein "/proc" benutzen. Aber Danke für den Hinweis, das dies unter nicht Linux-Systemen jedenfalls kein Standard ist/war.
@Xynon1: Lies meinen Beitrag nochmal. Ich sagte nicht, dass "/proc/" unter Linux kein Standard wäre. Im Gegenteil, unter Linux ist "/proc/" essentiell, weil einzige Schnittstelle zum Zugriff auf Prozess- und Systeminformationen.
Unter Unix allgemein ist "/proc/" nicht standardisiert. Es gibt viele Unix-Derivate ohne "/proc/", e.g. FreeBSD oder (iirc) HP-UX.
Unter Unix allgemein ist "/proc/" nicht standardisiert. Es gibt viele Unix-Derivate ohne "/proc/", e.g. FreeBSD oder (iirc) HP-UX.
Hast du auch alle "nicht"s bei mir gelesen
Ich hatte schon verstanden, das "/proc/" in Linux Standard ist. Ich hatte lediglich bemerkt, dass es bestimmt auch irgendeine Linux-Distribution gibt die sich nicht daran hält (zumindest möglich wäre es).
Das "/proc/" unter anderen unixoiden Betriebsystemen nicht der Standardfall ist, hast du ja sehr deutlich gemacht.
Ich hatte schon verstanden, das "/proc/" in Linux Standard ist. Ich hatte lediglich bemerkt, dass es bestimmt auch irgendeine Linux-Distribution gibt die sich nicht daran hält (zumindest möglich wäre es).
Das "/proc/" unter anderen unixoiden Betriebsystemen nicht der Standardfall ist, hast du ja sehr deutlich gemacht.
ok, da nützt mir das Script wohl nicht weiter. Kann man es irgendwie umschreiben das es auch in Win7 funzt?
Das Problem ist ja, dass die PID nach jedem Programmstart eine andere ist. Ich hab also nur den Tasknamen bzw. Programmnamen als Anhaltspunkt.
EDIT: lol kein Wunder das script ist aus einem Ubuntu Forum
Das Problem ist ja, dass die PID nach jedem Programmstart eine andere ist. Ich hab also nur den Tasknamen bzw. Programmnamen als Anhaltspunkt.
EDIT: lol kein Wunder das script ist aus einem Ubuntu Forum
Mit so vielen Verneinung war ich überfordert Sorry ...Xynon1 hat geschrieben:Hast du auch alle "nicht"s bei mir gelesen
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
http://lmgtfy.com/?q=python+windows+get+process+idbullrin hat geschrieben:ok, da nützt mir das Script wohl nicht weiter. Kann man es irgendwie umschreiben das es auch in Win7 funzt?
Das Problem ist ja, dass die PID nach jedem Programmstart eine andere ist. Ich hab also nur den Tasknamen bzw. Programmnamen als Anhaltspunkt.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Naja, nicht wirklich, AFAIK gibt es den Befehl erst ab Windows 2000 und was wichtiger ist das Problem ist ja nicht das beenden sondern das finden des Prozesses. Natürlich hat man bei "taskkill" die Möglichkeit Namen oder andere Details des Prozesses anzugeben, aber es läuft dennoch darauf das du zur eindeutigen Bennenung des Prozesses die PID benötigt wird.
bullrin hat geschrieben: ich bin kompletter Neuling in Python.
sry, aber ich bräuchte etwas genauere Infos bezüglich des Skriptes, da Python nicht wirklich verstehe. Die Syntax sieht etwas verwirrend aus, wenn man Java und C++ gewohnt ist.cofi hat geschrieben: http://lmgtfy.com/?q=python+windows+get+process+id
Vll könnt ihr mir sagen welche Funktion ich benutzen kann die mir dann die PID liefert. Den Rest mit dem task kill versuch ich dann selbst
EDIT: brauche wohl win32pdh. Die ist bei mir nicht vorhanden.
@bullrin: Wenn Du die Syntax nicht verstehst, dann kann man Dir schlecht helfen.
Und wenn Du mal ein wenig in den Suchergebnissen gelesen hättest, währst Du bei dem Treffer bei Stackoverflow.com auf dieses Modul gestossen: http://code.google.com/p/psutil/
Und wenn Du mal ein wenig in den Suchergebnissen gelesen hättest, währst Du bei dem Treffer bei Stackoverflow.com auf dieses Modul gestossen: http://code.google.com/p/psutil/
ok, das sieht schonmal nicht schlecht aus.
Ich könnte mir das Programm so vorstellen.
Ich bekomme die Liste der Prozesse durch
Dann prüfe ich in einer Schleife für jede pid den namen ob er mit dem gesuchten Prozess Namen übereinstimmt.
Wenn ich die richtige PID gefunden habe kill ich diese mit
würde das so funktionieren?
Ich könnte mir das Programm so vorstellen.
Ich bekomme die Liste der Prozesse durch
Code: Alles auswählen
psutil.get_pid_list()
Code: Alles auswählen
p = psutil.Process(7055)
p.name
Code: Alles auswählen
os.kill(pid)
@bullrin: Das könnte sein. Du könntest aber auch die Dokumentation lesen. Man kann auch gleich über die Prozesse iterieren und die Objekte die man da bekommt, haben auch Methoden die nützlich sein könnten.
ich schätze du meinst
könnt ihr mir nicht noch ein wenig unter die Arme greifen? Ich bekomme das so wahrscheinlich nicht hin. :K
Code: Alles auswählen
psutil.process_iter()
@bullrin: Das meinte ich. Schau Dir halt an was der Iterator für Objekte liefert, welchen Typ die haben, und welche Attribute/Methoden dieser Typ hat.
Falls es immer noch an der Python-Syntax hapert, einfach mal das Tutorial in der Python-Dokumentation durcharbeiten. Mit Java und C++ Vorkenntnissen sollte das grundlegend nicht so schwierig sein.
Falls es immer noch an der Python-Syntax hapert, einfach mal das Tutorial in der Python-Dokumentation durcharbeiten. Mit Java und C++ Vorkenntnissen sollte das grundlegend nicht so schwierig sein.