Name eines USB-Sticks herausfinden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich habe zurzeit eine Messwertaufnahme bei der die Daten auf einen USB-Stick gespeichert werden. Da aber nicht immer der gleiche USB in Verwendung ist und ich das Programm nicht bei jedem neuen USB-Stick umschreiben möchte wollte ich fragen ob es einen Weg gibt, den Namen des eingesteckten USB-Sticks ausgeben zu lassen.

    Also zum Beispiel "/media/pi/USB1"

    Ich hoffe, dass mir jemand dabei helfen kann.

    Vielen Dank bereits im Vorraus

    Gruß

    JOJO

  • Wenn es ein Blockdevice ist, geht das z.B. über "List Blockdevices" (lsblk) mit den Optionen Deiner Wahl laut < lsblk -h >

    Z.B. < lsblk -o name,label,partlabel,kname >, je nachdem, wo Du dem Stick seinen Namen verpasst hast.

    Alle "ls" Befehle haben der Vorteil, dass sie ohne Rootrechte verwendbar sind.

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Also gibt es keine Möglichkeit irgendeine Bibliothek in mein Python Programm einzubinden bei der ich mit einem Befehl das Verzeichnis des USB Sticks erhalte (/media/pi/NamedesUSB) sondern muss etwas beim mounten ändern?

    Wenn es doch einen Weg gibt wäre ich sehr dankbar, wenn mir jemand helfen könnte bzw. mir die Bibliothek aufzeigen könnte.

  • Was soll denn die Bibliothek liefern ?

    Der Name des Mountpoints ergibt sich aus der UUID des gemounteten Filesystems, bei Verwendung von Automount.

    Sonst steht er als where= in einer Mount-Unit, oder als Ziel in /etc/fstab.

    Wenn Du den USB Stick ansteckst und < lsblk -o name,label,partuuid,uuid,mountpoint > eigibst, siehst Du UUID/PARTUUID/LABEL und den tatsächlichen Mountpoint.

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo,

    es tut mir leid, dass ich mich nicht gemeldet habe.

    Also die Ausgabe mittels "lsblk -o label" ist fast das was ich brauche.

    Dabei werden leider noch Dinge ausgegeben, die ich nicht benötige

    Die Ausgabe des Befehls gibt foglendes aus:

    Ich möchte aber als Antwort für den Befehl nur "NamedesUSB" erhalten. Gibt es einen solchen Befehl?

  • Dann teste, ob das LABEL (NamedesUSB) in /dev/disk/by-label/NamedesUSB vorhanden ist.

    Servus !

    Ja der USB-Stick wird ganz normal eingebunden.

    UDEV kann ich leider nicht verwenden, da ich nicht immer den gleichen USB Stick verwende.

    Noch mal zur Erläuterung, damit das worauf ich hinauswill klar wird:

    Ich speichere Messwerte auf einen USB Stick, wobei zwischen bzw. bei den Messungen kein Bildschirm vorhanden ist. Die Messung wird also automatisch gestartet.

    Jetzt habe ich aber das Problem, dass die Messwerte auf den USB-Stick mit einem bestimmten Verzeichnis gespeichert werden (/media/pi/NamedesUSB).

    Ich habe aber leider den Fall, dass nicht immer der gleiche Name des USB-Sticks vorhanden ist.

    Jetzt möchte ich vor dem eigentlichen Programmstart eine Zeile reinhängen, bei der abgefragt wird, wie der Name des USB-Sticks ist, der eingesteckt ist und diesen Namen würde ich dann einer Variablen übergeben, damit der SPeicherort /media/pi/... variabel ist.

    Ich hoffe es ist klar, was ich suche und hoffe, dass ir da jemand weiterhelfen kann.

    Vielen Dank bereits im Voraus

    Gruß JOJO

    • Offizieller Beitrag

    Da nicht klar ist welches OS und / oder mit Desktop bleibt mir auch nur orakeln. :gk1:

    Jetzt habe ich aber das Problem, dass die Messwerte auf den USB-Stick mit einem bestimmten Verzeichnis gespeichert werden (/media/pi/NamedesUSB).

    Klingt nach Automount per Dateimanager (PCManfm). Dann könnte man doch einfach das Verzeichnis /media/pi auslesen und sehen welches Verzeichnis dort (neu) auftaucht und den Namen des USB-Sticks trägt.

    Code
    ls -m /media/pi

    Färtsch! :shy:

  • UDEV kann ich leider nicht verwenden, da ich nicht immer den gleichen USB Stick verwende.

    Aber udev ist doch nicht auf einen bestimmten USB Stick eingeschränkt. Theoretisch solltest du eine oder mehrere udev Regeln erstellen können, die den angeschlossenen Stick erkennen (oder generell alle USB Sticks) und dann z.B. mounten. Der Mountpunkt wäre dann von dir festgelegt und eindeutig nutzbar.

  • Hi JoJo_57 ,

    ich habe bei meinem in Python3 programmierten yamuplay udev über das Python-Modul pyudev eingebunden:

    Python
    import pyudev

    Die Aufgabenstellung ist ganz ähnlich:

    Wenn ein USB-Stick gesteckt oder entfernt wird, soll in einem tkinter-treeview-Steuerelement die Verzeichnisstruktur eines USB-Sticks in Baumansicht eingefügt bzw. wieder entfernt werden.

    Teil 1: USB-Ereignishandler einrichten:

    Wichtig ist zunächst, über pyudev einen USB-Ereignishandler, d.h. eine Funktion in Python3 einzurichten, die aufgerufen wird, wenn udev ein USB-Ereignis erkennt:

    Python
            # USB-Ereignishandler einrichten:
            context = pyudev.Context()
            monitor = pyudev.Monitor.from_netlink(context)
            monitor.filter_by('usb') # filtert nur die USB-Ereignisse
            observer = pyudev.MonitorObserver(monitor, callback=self.usb_eventhandler, name='USB observer')
            observer.daemon
            observer.start()

    In diesem Beispiel wird die Funktion bzw. Klassenmethode self.usb_eventhandler als sogenannter callback eingerichtet, d.h. diese Funktion wird aufgerufen, wenn udev ein (beliebiges) USB-Ereignis erkennt. Syntaxmäßig ist zu beachten, dass die Referenz auf die Funktion (sowas wie der Einsprungspunkt bzw. die Speicheradresse der Funktion) in Python3 ohne Klammern übergeben werden muss! Mit Klammern ist ein "beliebter" Anfängerfehler, auf den ich damals auch hereinfiel :no_sad:

    Ich hab diese Befehlsfolge auch im Internet gefunden und kann es leider immer noch nicht stichhaltig erklären :angel:
    Aber wenigstens verstehe ich es mit meinem inzwischen etwas weiter fortgeschrittenem Python-Wissen mittlerweile einigermaßen:

    EDIT:

    In monitor wird definiert, was beobachtet werden soll: filter_by('usb')

    Der observer wacht über die in monitor definierten Ereignisse und legt fest, welche Callback-Funktion im Ereignisfall aufgerufen werden soll

    Teil 2: Die Funktion des Ereignishandlers programmieren:

    Übergabeparameter:

    self: Klasseninstanz (nur bei objektorientierter Programmierung)

    usbdevice: Dieser Parameter enthält Details zum aufgetretenen USB-Ereignis, das in der Routine abgearbeitet werden soll

    Ich habe das jetzt nur mal schnell aus meinem yamuplay-Quellcode herauskopiert und ohne Test(!) hier für's Forum angepasst. Naja, das Original (und auch die Auszüge hier) sind nicht ganz PEP8-konform. Das Projekt bedarf jetzt dann mal einer kräftigen Überarbeitung! :stumm:

    Wenn der Code hier nicht läuft, alles außer die prints einfach mal rauswerfen.

    Ich hoffe, ich konnte hiermit ein wenig bezüglich udev und pyudev helfen...

    • Offizieller Beitrag

    Hi schlizbäda!

    Falls PCManfm einen Automount macht, wäre das imho in Python ganz leicht umzusetzen. Aber Achtung, das nur nach einer schnellen Recherche dazu!

    Die kurze Variante für alle USB-Devices in diesem Verzeichnis:

    Code
    import os
    for usb_stick in next(os.walk("/media/pi/"))[1]:
        print(usb_stick)

    oder als Liste:

    Code
    import os
    verzeichnispfad = "/media/pi/"
    verzeichnisinhalt = next(os.walk(verzeichnispfad))[1]
    print(verzeichnisinhalt)

    Oder nur den ersten aus der Liste, falls das der einzige Stick ist:

    Code
    import os
    verzeichnispfad = "/media/pi/"
    verzeichnisinhalt = next(os.walk(verzeichnispfad))[1]
    print(verzeichnisinhalt[0])
  • Hi hyle,

    das udev-Event ist eigentlich nur dann interessant, wenn man nach dem An- bzw. Abstecken eines USB-Massenspeichers irgendwelche Anzeigen einigermaßen "in Echtzeit" aktualisieren möchte. Dann im Eventhandler Deine Codeschnipsel einfügen...

    Wobei ich im Code meines yamuplay hier einige Dinge sehe, die ich heute mit mehr Python-Erfahrung so nicht mehr machen würde...

    Jetzt werde ich mich zunächst mal mit der Fotobox von Goldjunge weiter befassen. Ich habe dort den Teil "Einbindung des omxplayers" übernommen. Die neuen Erkenntnisse daraus will ich dann in eine gründliche Überarbeitung von yamuplay.py einfließen lassen. Wahrscheinlich läuft's eher auf ein ganz neu aufgesetztes Projekt für 2021 hinaus... yamuplay 1.0 :)

    • Offizieller Beitrag

    das udev-Event ist eigentlich nur dann interessant, wenn man nach dem An- bzw. Abstecken eines USB-Massenspeichers irgendwelche Anzeigen einigermaßen "in Echtzeit" aktualisieren möchte.

    Ist klar! ;) So wie ich den TO im Beitrag #6 verstehe will er einfach nur am Anfang seines Skripts den Pfad zu seinem USB-Stick herausfinden, also wäre "Echtzeit" nicht wichtig. Wenn der Stick allerdings nicht automatisch dahin gemountet wird, ist udev natürlich sinnvoller.

  • Eine andere (einfachere), aber hier nicht angefragte Möglichkeit wäre, den Speicherstick, auf dem auch die Messdaten geschrieben werden sollen, mit dem Label "USB1" zu versehen.

    Beispiel für EXT4:

    < tune2fs -L USB1 /dev/sdb1 >

    Dann wird die Partition unter dem Mountpoint USB1 (wie vom Programm gewünscht), autogemountet.


    Servus !

    RTFM = Read The Factory Manual, oder so

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!