ubuntuusers.de

USB-Abfrage / Python

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

noisefloor schrieb:

Python Programme werden nicht kompiliert...

Genau genommen wird bei CPython der Quelltext als bytecode kompiliert und dieser wird dann interpretiert.

Wenn es DER USB-Stick ist, also immer ein bestimmter, dann würde ich den auch per udev-Regel erkennen lassen und dann immer auf einen spezifischen Pfad mounten. Wenn es EIN USB-Stick ist, ist das schwieriger...

Wenn man udisks2 nutzt ist es eigentlich recht einfach: http://blog.madbob.org/daemons-blasfemy-and-automounting/ - https://linuxmeerkat.wordpress.com/2014/11/12/python-detection-of-usb-storage-device/ sollte man lesen, um die Hintergründe zu verstehen (die DBus API-Beschreibung von udisks2 hatte ich ja bereits verlinkt). Das Python-Modul dbus steckt in den Paketen python-dbus bzw. python3-dbus.

Und statt lsusb könnte man auch pyusb (Paket python-usb) nutzen - z.B. um an die IDs von Hersteller und Produkt zu kommen:

1
2
3
4
5
from __future__ import print_function
import usb.core

for device in usb.core.find(find_all=True):
    print("{:04x}:{:04x}".format(d.idVendor, d.idProduct))

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Abend Forum

Ich hab folgenden kurzen Python3 Code der funktioniert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import subprocess
# Byte-Werte aus Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")
# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
# String-Werte in Variable packen
usbid = output
# USB-Abfrageinhalt drucken
print (usbid)
# USB-Seriennummern-Vergleich
usbid = usbid.find('054c:019e')
# Suchergebnis drucken
print (usbid)

Zur Verdeutlichung lass ich mir das im Terminal ausgeben:

1
2
3
4
5
6
7
8
Bus 001 Device 005: ID 1111:1111 Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)
Bus 001 Device 004: ID 054c:019e Sony Corp. Micro Vault 1.0G Mass Storage
Bus 001 Device 001: ID 2222:2222 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 3333:3333 Chicony Electronics Co., Ltd HP Multimedia Keyboard
Bus 002 Device 002: ID 4444:4444 Primax Electronics, Ltd HP Optical Mouse
Bus 002 Device 001: ID 5555:5555 Linux Foundation 1.1 root hub

123

Die obere Tabelle ist die USB-Abfrage. Die "123" das positive Ergebnis der Suche nach einem bestimmten USB-Stick, dessen ID mir bekannt ist. In einem späteren Schritt möchte ich Daten von meinem Python3 Programm auf einen bestimmten (ID) USB-Stick schreiben und lesen können. Dazu werde ich wohl so etwas wie einen Pfad benötigen. Nun kann aber der bestimmte (ID) USB-Stick natürlich in unterschiedliche USB-Buchsen gesteckt werden.

Jetzt frage ich mich, ob Bus-Nummer und Device-Nummer einer aktuellen Abfrage, wie oben aufgeführt, genügend Information darstellen, um in einem späteren Schritt auf diesen USB-Stick lesend und schreiben zugreifen zu können.

Gruß HP-Fan

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Dazu werde ich wohl so etwas wie einen Pfad benötigen

Du benötigst den Pfad, unter dem der USB-Stick eingehängt ist, richtig.

Unter Ubuntu 16.04 (andere *buntus müsstest du testen) sollte der Pfad /media/DEIN_BENUTZERNAME/054A:019E sein. Achtung: in der ID sind die Buchstaben klein, im Pfad groß! Heißt, du brauchst lsusb noch nicht mal.

Und nochmal Achtung: ob das auf dem Raspi auch so ist, musst du testen. Wenn du Raspbian einsetzt, könnte der Mount-Punkt auch anders sein, wenn Debian / Raspbian das anders handhabt. Kann ich dir nicht sagen, weil ich auf meinen Raspis keine USB-Sticks nutzt.

Gruß, noisefloor

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Nachtrag: einfacher (und sicherer) wäre IMHO, wenn du eine udev-Regel erstellst, die veranlasst, dass dem Stick immer der gleiche Einhängepunkt zugewiesen wird.

Grußl noisefloor

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Abend noisefloor

Hmmm... wenn man mit meinem Progämmchen oben automatisch de­tek­tie­ren kann, ob der USB-Stick mit der ID anwesend ist, gibt es dann auch eine Methode um zu sehen, wo der USB-Stick mit der entsprechenden ID-Nummer gemountet ist? Oder lass mich die Frage anders formulieren:

Bekommt man mit der ID des USB-Sticks dessen Pfad heraus, wenn er eingesteckt ist?

Und nochmal Achtung: ob das auf dem Raspi auch so ist, musst du testen. Wenn du Raspbian einsetzt, könnte der Mount-Punkt auch anders sein, wenn Debian / Raspbian das anders handhabt.

Wie gesagt, entwickelt wird auf 16.04. Späterer Zieleinsatz soll ein Raspberry PI3 sein. Ab Werk ist übrigens OS-Noob dabei, was Raspbian inkludieren soll (Habe das System aber noch nicht). Deshalb bringt es mir wenig, wenn ich den Pfad händisch fest "tackere". Wenn sich allerdings nichts Automatisches finden sollte, muss es wohl so sein.

Freundlichen Gruß zurück

HP-Fan

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Nachtrag

Ich habe gerade etwas von einer Mount-Liste gelesen. Es ist wohl so, das man sich die Liste der gemouteten Geräte ausgeben lassen muss, und dann in einem zweiten Schritt in dieser Liste dann die ID suchen muss. So oder so ähnlich. ich lese mal weiter...

Gruß HP-Fan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

HP-Fan schrieb:

Nachtrag

Ich habe gerade etwas von einer Mount-Liste gelesen. Es ist wohl so, das man sich die Liste der gemouteten Geräte ausgeben lassen muss, und dann in einem zweiten

Eine solche Liste ist /etc/mtab, denn eine Tabelle ist eine Liste von Datensätzen.

Du kannst auch /etc/mtab auslesen. Das ist die Tabelle gemounteter Dateisysteme. Auf einem Stick können auch mehrere sein.

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Hallo Forum

Mal eine Frage zum Terminal. Ich teste gerne Befehle im Terminal, bevor ich sie in Python3 verwende. Wenn ich...

1
less /etc/fstab

oder...

1
less /etc/mtab

... im Terminal ausführe, wird der Inhalt zwar angezeigt, aber die Terminalausgabe endet mit einem hell hinterlegtem...

less /etc/fstab (END)

Mit Enter kommt dann ein hinterlegtes

END

Dann kann man nichts mehr machen bzw. ein "exit" in Terminal schreiben. Wenn ich die "ESC"-Taste drücke, wird ein nicht hinterlegtes "ESC" angezeigt. Aber auch hier komme ich nicht mehr aus dem Terminal. Wenn ich die Shift-Taste gedrückthalte und ein "E" Tippe wird Examine angezeigt. Unterschiedliche Buchstaben ergeben unterschiedliche Meldungen, aber ich komme nicht mehr heraus. Ich muss das Terminal mit dem "X" in der linken oberen Ecke "zwangsschliessen" - mit der Meldung es liefe noch ein Prozess im Terminal. Ein Schließen würde das Terminal beenden.

Ist das normal, das man bei diesen zwei Befehlen für das Terminal nicht mehr heraus kommt?

Gruß HP-Fan

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

[Off_Topic]
HP-Fan schrieb:

Mal eine Frage zum Terminal. Ich teste gerne Befehle im Terminal, bevor ich sie in Python3 verwende. Wenn ich...

1
less /etc/fstab

... im Terminal ausführe, wird der Inhalt zwar angezeigt, aber die Terminalausgabe endet mit einem hell hinterlegtem...

less /etc/fstab (END)
...

Das ist völlig normal: schließlich hat less seine eigene Syntax (die Du z.B. bei den man-pages auch benutzt),
und da machen einige übliche Tastendrücke überhaupt keinen Eindruck.

Mit einem "q" kannst Du die show allerdings ganz einfach beenden.
[/Off_Topic]

LG,

track

HP-Fan

(Themenstarter)
Avatar von HP-Fan

Anmeldungsdatum:
2. September 2012

Beiträge: 394

Wohnort: Schweiz (CH)

Hallo track

Eventuell "q" wie quit??? Oh man wie peinlich 😳

Auch dir 1000 Dank track → Ab sofort nur noch track the crack! 👍

Gruß

HP-Fan

Antworten |