Prozesse zählen und Aktion ausführen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
volcem
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:09

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
volcem
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:09

@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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
volcem
User
Beiträge: 3
Registriert: Sonntag 3. Dezember 2017, 16:09

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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()
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten