Abfragen welcher Browser offen ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Eng1996
User
Beiträge: 2
Registriert: Donnerstag 6. März 2014, 11:49

Guten Tag,
gibt es in Python ein Modul/Funktion welches herausfindet welcher Browser gerade offen ist?
Also im Grunde einfach den Namen zurückgibt: z.B Chrome, Firefox oder Internet Explorer.
Am liebsten dann noch die URLs von den Tabs die gerade offen sind.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Mit psutil.process_iter() kommt man an einer Liste aktiver Prozesse, k.A. wie man da auf die URL kommt.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Eng1996 hat geschrieben:gibt es in Python ein Modul/Funktion welches herausfindet welcher Browser gerade offen ist?
Nicht mit einer speziell dafür vorgesehenen magischen Funktion. Python ist weder speziell für bestimmte externe Programme, noch für spezielle Betriebssysteme gebaut.

Vielleicht können wir dir konkretere Ansatzpunkte liefern wenn du uns sagst, ob du bei den Betriebssystemen eine bestimmte Einschränkung vornehmen kannst.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

darktrym hat geschrieben:Mit psutil.process_iter() kommt man an einer Liste aktiver Prozesse, k.A. wie man da auf die URL kommt.
Netterweise sollte man noch erwähnen, dass psutil nicht in der Standardbibliothek vorhanden ist. Du kannst aber psutil im Python Package Index (pypi) finden.
Eng1996
User
Beiträge: 2
Registriert: Donnerstag 6. März 2014, 11:49

/me hat geschrieben:Vielleicht können wir dir konkretere Ansatzpunkte liefern wenn du uns sagst, ob du bei den Betriebssystemen eine bestimmte Einschränkung vornehmen kannst.
Was meinst du konkret damit? Wir benutzen hier Windows als angepasstes Image, nur leider wurde vergessen einen "Browserlook" einzubinden so das nur ein Browser verwendet werden darf. Jetzt habe ich die Aufgabe bekommen diesen im Nachhinein selber zu schreiben. Wie ich in auf knapp 1000 Rechner bekomme? Wir haben hier in der It ein Tool mit dem wir auf jedes Verzeichnis auf den Rechnern der Verwaltung zugreifen können und über eine Schnittelle kann man mit ein paar Klicks Programme und Scripts installieren.


Gut dann schau ich mir erstmal process_iter() an. Danke für den Tipp.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Eng1996: welche Programme ausgeführt werden dürfen, kann man soweit ich weiß in den Windows Komponenten Richtlinien festlegen. Jede andere Methode, vor allem irgendwelches selbstgeschriebene Zeug, läßt sich mit einfachsten Mitteln aushebeln.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Eng1996 hat geschrieben:Gut dann schau ich mir erstmal process_iter() an.
Alle Konsolen abmurksen.

Code: Alles auswählen

import psutil

def main():
    consoles = [p for p in psutil.process_iter() if p.as_dict(attrs=['name'])['name'] == 'cmd.exe']
    for proc in consoles:
        proc.kill()

if __name__ == '__main__':
    main()
BlackJack

@/me: Gibt es einen Grund für die komplizierte ``if``-Bedingung? Warum nicht einfach ``p.name == 'cmd.exe'``?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@/me: Gibt es einen Grund für die komplizierte ``if``-Bedingung? Warum nicht einfach ``p.name == 'cmd.exe'``?
Zumindest bei mir verhält sich das nicht so wie erwartet.

Code: Alles auswählen

    for proc in psutil.process_iter():
        print(proc.name)

Code: Alles auswählen

<bound method Process.name of <psutil.Process(pid=0, name='System Idle Process') at 33128048>>
<bound method Process.name of <psutil.Process(pid=4, name='System') at 33128112>>
<bound method Process.name of <psutil.Process(pid=128) at 33128240>>
<bound method Process.name of <psutil.Process(pid=348) at 33128208>>
[...]
Alternativ mit name als Methodenaufruf.

Code: Alles auswählen

    for proc in psutil.process_iter():
        print(proc.name())

Code: Alles auswählen

System Idle Process
System
Traceback (most recent call last):
  File "C:/pyjects/test/libraries/psutil_/r1.py", line 39, in <module>
    main()
  File "C:/pyjects/test/libraries/psutil_/r1.py", line 27, in main
    print(proc.name())
  File "C:\Python27\lib\site-packages\psutil\__init__.py", line 490, in name
    name = self._proc.name()
  File "C:\Python27\lib\site-packages\psutil\_pswindows.py", line 185, in wrapper
    return fun(self, *args, **kwargs)
  File "C:\Python27\lib\site-packages\psutil\_pswindows.py", line 220, in name
    return os.path.basename(self.exe())
  File "C:\Python27\lib\site-packages\psutil\_pswindows.py", line 192, in wrapper
    raise AccessDenied(self.pid, self._name)
psutil.AccessDenied: (pid=128)
Das unhandliche Gefummel in meinem Beispielcode scheint das Problem zu umgehen.
BlackJack

@/me: Das `name()` jetzt eine Methode ist scheint mit `psutil` 2.0 so zu sein. Und das mit der Zugriffsausnahme ist mir unter Linux noch nie passiert, das scheint eine Windows-Eigenschaft zu sein.
Antworten