Seite 1 von 1

Prozesse zählen und Aktion ausführen

Verfasst: Sonntag 3. Dezember 2017, 17:26
von volcem
Hallo,

ich bin ziemlich neu im Python programmieren eingestiegen, und verstehe das Problem nicht.

Ich habe einen Hardware Button an meinem Raspberry Pi der im alten script ein Radiostream geöffnet hat und über einen zweiten Button wurde das Programm wieder geschlossen.

Jetzt möchte ich das ganze aber in meinem Hängeschrank einbauen wo der Touchscreen bereits verbaut ist.
Daher wollte ich es über einen Button realisieren.

Script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import RPi.GPIO as GPIO
import webbrowser
import os

# SET GPIO Button-Pin
gpio = 5
# Zaehle Prozesse
#pruefe = os.popen("sudo pgrep -f 'chromium-browser' | wc -l")
# Main Function
def main():
  value = 0
  pruefe = os.popen("sudo pgrep -f 'chromium-browser' | wc -l").readlines()[0]
  while True:

    if not GPIO.input(gpio):
      value += 0.01

    if value > 0:

      if GPIO.input(gpio):
	print pruefe
	if pruefe == 8:
	    pid = os.popen("ps aux | grep chromium-browse | awk '{print $2}'").readlines()[0]
	    os.system('sudo kill '+pid)
	    print "wird geschlossen"
	    main()
	else:
	    url = "http://webradio.radiokw.de/"
	    b = webbrowser.get('chromium-browser')
	    b.open(url)
	    print "wird geoeffnet"
	    main()

    time.sleep(0.03)

  return 0

if __name__ == '__main__':
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(gpio, GPIO.IN)
  main()
Chromium-Browser gibt bei manueller Ausgabe immer 8 zurück.
Daher dachte ich es würde mit einer Prüfung auf == 8 gehen.
Leider nicht..

Könnte man es anders lösen?

Vielen Dank für die Hinweise.

Re: Prozesse zählen und Aktion ausführen

Verfasst: Sonntag 3. Dezember 2017, 18:41
von Sirius3
@volcem: Deine Einrückungen sind kaputt. So kann man das Programm nicht verstehen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene. os.popen und os.system sind veraltet, nutze statt dessen subprocess, hier hilft vielleicht sogar psutils noch mehr. `pruefe` enthält einen String, der niemals gleich einer Zahl sein kann. Wie kommst Du darauf, dass chromium immer 8 Prozesse gestartet hat? Das halt ich für einen sehr fragilen Test. Du hast in `main` bereits eine while-True-Schleife. Rekursiv main aufzurufen ist erstens nie eine gute Idee. Du nutzt »webbrowser« gar nicht richtig, sondern nur dazu, ein Programm zu starten.

Re: Prozesse zählen und Aktion ausführen

Verfasst: Freitag 8. Dezember 2017, 10:47
von volcem
@Sirius3

Vielen Dank für den Hinweis werde es mit subprocess mal versuchen umzusetzen.

Der String gibt eine gezählte Prozessanzahl zurück ( WC -l ) , in meinem Fall immer 8 Prozesse ( Chromium- Browser )

Daher eben die Annahme das ich einfach einen vergleich machen könnte.
Du hast in `main` bereits eine while-True-Schleife. Rekursiv main aufzurufen ist erstens nie eine gute Idee. Du nutzt »webbrowser« gar nicht richtig, sondern nur dazu, ein Programm zu starten.
Dadurch bedingt das dass Script die ganze Zeit auf "Order" wartet ( Button gedrückt ) läuft es immer Rekursiv.

Code: Alles auswählen

import Webbrowser 
wird genutzt um den Webbrowser ( Chromium ) zu öffnen wenn ich den Button drücke.

Zusammengefasst soll folgendes passieren:

Ich drücke den Hardware-Button - Radiostream über den Chromium-Browser wird geöffnet
Ich drücke den Hardware-Button erneut --- Browser soll geschlossen werden.

Re: Prozesse zählen und Aktion ausführen

Verfasst: Freitag 8. Dezember 2017, 12:08
von __deets__
Wieso interessiert dich denn die genaue Anzahl? Reicht es nicht zu prüfen ob der Browser läuft?

Und statt chromium hart zu starten/stoppen wäre es ggf besser das hier zu benutzen: https://github.com/smblott-github/chromix-too

Re: Prozesse zählen und Aktion ausführen

Verfasst: Freitag 8. Dezember 2017, 14:39
von volcem
Die genaue Anzahl interessiert mich nicht, ich bin nur beim Lesen auf diese Funktion gestoßen und hab dann gedacht es wäre möglich diesen Weg zu gehen.

Richtig, ich benötige nur die Information ob der Prozess läuft, eine Überprüfung ob true oder false und dementsprechend starten oder stoppen.

Ich schaue es mir mal an, vielen Dank.

Re: Prozesse zählen und Aktion ausführen

Verfasst: Freitag 8. Dezember 2017, 15:48
von DeaD_EyE
Mal angenommen du weißt nicht die PID des Prozesses und auch nicht wie viele Instanzen des Programs laufen.
Das würde dann erfordern, dass du die Prozesse nach dem Namen suchst. Unter Linux geht es halt mit Boardmitteln.
Mit Python könntest du das Problem so lösen:

Code: Alles auswählen

import os
import pathlab
import signal

pid_paths = [p for p in pathlib.Path('/proc').glob('*') if p.name.isdigit()]
for proc in pid_paths:
    comm = proc / 'comm'
    try:
        name = comm.read_text().strip()
    except FileNotFoundError:
        continue
    if 'chrome' in name.lower():
        os.kill(int(proc.name), signal.SIGTERM)
Aber man kann es auch mit psutil erledigen. Das ist dann ein bisschen abstrahiert und sieht ordentlicher aus:

Code: Alles auswählen

for proc in psutil.process_iter():
    if 'chrome' in proc.name():
        proc.kill()