Erkennung auf Änderungen am USB-Port funktioniert nicht in einer virtuellen Umgebung

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
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo,

folgender Python 3 Code reagiert nur auf Änderungen an USB-Ports, wenn er nicht in einer virtuellen Umgebung (venv) ausgeführt wird. In meinem Fall wurde die virtuelle Umgebung von PyCharm eingerichtet und die Pakete `PyQt5` und `pyudev` zusätzlich installiert.
  1. Warum funktioniert die Erkennung auf Änderungen am USB-Port nicht in einer virtuellen Umgebung?
  2. Was muss man am Code (oder in PyCharm) ändern, damit die Erkennung auch in einer virtuellen Umgebung tut was sie soll?

Code: Alles auswählen

import sys
import pyudev
from PyQt5.QtWidgets import QApplication
from pyudev.pyqt5 import MonitorObserver


class USBDetector:
    def __init__(self):
        self._context = pyudev.Context()
        self._monitor = pyudev.Monitor.from_netlink(self._context)
        self._observer = MonitorObserver(self._monitor)
        self._monitor.start()
        for device in iter(self._monitor.poll, None):
            if device.action == 'add':
                # some function to run on insertion of usb
                print("Device added")
            elif device.action == 'remove':
                # some function to run on removal of usb
                print("Device removed")


def main():
    app = QApplication(sys.argv)
    usb_detector = USBDetector()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
Gruß
Atalanttore
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Keine Erklärung. Kannst du nicht einfach auf das venv verzichten?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Auf die virtuelle Umgebung kann ich natürlich auch verzichten. Allerdings würde mich die Ursache, warum es in der virtuellen Umgebung nicht funktioniert, sehr interessieren.

Gruß
Atalanttore
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dann mach mal mehr Angaben zur Fehlerbeschreibung, abgesehen vom venv.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bei mir funktioniert genau das innerhalb eines venvs. Somit kann ich dir keine Hinweise geben, wie ja auch schon erwaehnt. Wenn du dem tiefer auf die Spur kommen willst, wirst du in Linux System Debugging einsteigen muessen. ZB mit strace schauen, was da passiert, und was ggf. nicht passiert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Zur Fehlersuche würde ich zuerste einmal prüfen, ob und wo die Unterschiede zwischen der normalen und der "virtuellen" Umgebung liegen.

* Beides aus der Kommadozeile und nicht einer IDE starten.
* Die Versionen der installierten Module prüfen.
* Die Umgebungsvariablen prüfen.
* Den verwendeten Interpreter prüfen.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

__deets__ hat geschrieben: Montag 3. Februar 2020, 17:33 Bei mir funktioniert genau das innerhalb eines venvs. Somit kann ich dir keine Hinweise geben, wie ja auch schon erwaehnt. Wenn du dem tiefer auf die Spur kommen willst, wirst du in Linux System Debugging einsteigen muessen. ZB mit strace schauen, was da passiert, und was ggf. nicht passiert.
Mit strace habe ich noch nie gearbeitet und mit Linux System Debugging habe ich mich auch noch nie beschäftigt. Hast du einen guten Link zum Einlesen in das Thema?


sparrow hat geschrieben: Montag 3. Februar 2020, 22:24 Zur Fehlersuche würde ich zuerste einmal prüfen, ob und wo die Unterschiede zwischen der normalen und der "virtuellen" Umgebung liegen.

* Beides aus der Kommadozeile und nicht einer IDE starten.
* Die Versionen der installierten Module prüfen.
* Die Umgebungsvariablen prüfen.
* Den verwendeten Interpreter prüfen.
Mit einer virtuellen Umgebung, die in der Kommadozeile erstellt wurde, funktioniert die Erkennung auf Änderungen an den USB-Ports genauso wie in der normalen Umgebung, sofern die benötigen Pakete installiert sind.

Lediglich in einer virtuellen Umgebung, die in PyCharm erstellt wurde, funktioniert es nicht. Dabei ist mir aufgefallen, dass sich das Skript nicht mehr normal beenden lässt, wenn es während der Ausführung eine Änderung an den USB-Ports gab. Es hilft dann nur noch ein Kill. Ohne Änderungen an den USB-Ports lässt sich das Skript hingegen ganz normal wieder beenden. Nach mehreren Versuchen erschien nach einem Kill auch folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/ata/source/test/venv/lib/python3.7/site-packages/pyudev/_qt_base.py", line 67, in _process_udev_event
    def _process_udev_event(self):
KeyboardInterrupt
Steckt das Problem eher in der IDE PyCharm oder im Paket `pyudev`?

Gruß
Atalanttore
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ehrliche Meinung?
Hier tauchen ständig Themen auf, bei denen Leute mit den venv von Pycharm nicht klar kommen. Ich benutze das nicht, keine Ahnung, ob das wirklich so schwierig ist.
Ich würde das Ding einfach mit einem venv auf der Konsole starten. Dann hat man alles in der Hand und weiß was wann warum wie passiert.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

☝️Was sparrow sagt. Und nein, einzelne Links zu komplexen Themen habe ich nicht. Da muss man anfangen, ausprobieren, suchen.

Es könnte aber tatsächlich gut sein, das es (wie oft mit IDEs) etwas mit dem eventloop zu tun hat. Der muss getrieben werden, damit Events ankommen. Und da mag pycharm interferieren.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@sparrow & __deets__: Danke für die Erläuterungen.
__deets__ hat geschrieben: Dienstag 4. Februar 2020, 22:52 Es könnte aber tatsächlich gut sein, das es (wie oft mit IDEs) etwas mit dem eventloop zu tun hat. Der muss getrieben werden, damit Events ankommen. Und da mag pycharm interferieren.
Was meinst du mit "treiben" bei einem Eventloop genau?

Gruß
Atalanttore
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man muss den halt immer wieder betreten, damit der alle anstehenden Events verarbeitet. Und pyudev arbeitet per Definition mit Events. Diese Event-Verarbeitung muss man eben antreiben, und weil PyCharm fuer seine GUI *auch* einen Event-Loop hat, dann muss man die verheiraten, oder es gibt knatsch. Das koennte eben eine Erklaerung sein.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Wie verheiratet man Event-Loops?

Gruß
Atalanttore
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem man was auch immer die verschiedenen Event-Loops brauchen (wie zB Qt und glib) so kombiniert, das beide Bibliotheken gluecklich sind. So wie in jeder guten Ehe.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Erst einmal schaut man welcher Konfession die beiden angehören und dann sucht man sich jemand passenden der die Trauung vornehmen kann. 👰🤵💒🤡
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__blackjack__: Als Atheist bin ich da dann raus. :mrgreen:
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

sparrow hat geschrieben: Dienstag 4. Februar 2020, 21:58 Hier tauchen ständig Themen auf, bei denen Leute mit den venv von Pycharm nicht klar kommen. Ich benutze das nicht, keine Ahnung, ob das wirklich so schwierig ist.
Was gut funktioniert, ist das venv händisch anzulegen und dann einfach als Interpreter für das Pycharm-Projekt zu hinterlegen. Generell würde ich persönlich für das Venv-/Paketmanagement und einige andere Dinge immer meine Shell (… nicht die eingebaute von PyCharm …) bevorzugen. So mache ich das jedenfalls, wenn ich denn mal PyCharm verwende (für komplexere Django Projekte) und hatte noch nie die Schwierigkeiten, von denen man hier regelmäßig hört.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@nezzcarth: Danke für den Tipp.

Bei der Auswahl einer händisch angelegten virtuellen Umgebung (venv) in PyCharm wird folgendes gemeldet:

Code: Alles auswählen

Python packaging tools not found. Install packaging tools
Nach einem Klick auf "Install packaging tools" wird allerdings nichts installiert und die Meldung bleibt bestehen.

Die händisch in der virtuellen Umgebung nachinstallierten Pakete `pyudev` und `pyqt5` werden in PyCharm leider auch nicht erkannt.

Was sind die "packaging tools"?

Gruß
Atalanttore
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Problem gefunden, genaue Ursache unbekannt.

Vor kurzem habe ich mein System neu eingerichtet. Dabei habe ich PyCharm nicht mehr als Snap-Paket, sondern als Flatpak-Paket installiert.

Nach der Deinstallation des Flatpak-Paketes und der Installation des Snap-Paketes von PyCharm funktionieren virtuelle Umgebungen in PyCharm wie erwartet.

Wenn ich mich nach der Neueinrichtung des Systems nicht zufällig mit virtuellen Umgebungen und `pyudev` beschäftigt hätte, wäre mir das Problem vermutlich nicht (so schnell) aufgefallen.

@__deets__: Mehrere Event-Loops von verschiedenen Bibliotheken kombinieren hebe ich mir für später auf. Mit meinem aktuellen Kenntnisstand weiß ich nicht mal wie man damit anfängt. Trotzdem danke für die interessanten Informationen.

Gruß
Atalanttore
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine andere Erklärung: flatpacks laufen in einer sandbox. Da kommt man ggf an solche Informationen nicht oder nur mit Erweiterung der Privilegien dran. Wie man zb auch auf dem iPhone explizit Dinge wie die Kamera anfordern, und vom User bestätigen lassen muss.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Danke für den Hinweis. Erstaunlicherweise laufen Snap-Pakete auch in einer Sandbox. PyCharm als Snap-Paket bekam nach der Installation von mir jedoch keine zusätzlichen Privilegien.

Gruß
Atalanttore
Antworten