Ich möchte verhindern, dass der an den Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems bon wird (Python-Skript).

Vorwort

In diesem Artikel möchte ich verhindern, dass der an den Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems fehlerfrei wird (Perl-Skript)](http://qiita.com/kouichirou/items/76dadc7cab6ef694fe18) Es ist der Inhalt, den ich geschrieben habe. Bitte beachten Sie daher, dass es außer dem Skript nichts Neues gibt.

Annahme

Bitte überprüfen Sie Ich möchte verhindern, dass der an Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems fehlerfrei wird (Perl-Skript).

Kommentar

Lass uns jetzt gehen.

Ganzes Skript

Ich werde es vorerst einfügen. Ich werde es unten erklären.

get_dac_port_num.py


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

import sys
import re

HUB = {}

reBUS  = re.compile(r'Bus (\d*)\.Port')
reHUB  = re.compile(r'^(\s*)\|__.*Port (\d*): .*Class=Hub')
rePort = re.compile(r'^(\s*)\|__.*Port (\d*): .*Driver=snd-usb-audio')

for line in sys.stdin:
        tmp = reHUB.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2))) + "."
                continue

        tmp = rePort.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2)))
                for v in range(0,len(tmp.group(1))+1):
                        if HUB.has_key(v):
                                sys.stdout.write(HUB.get(v))
                exit()

        tmp = reBUS.search( line )
        if tmp:
                HUB[0] = str(int(tmp.group(1))) + "-"
                continue

Lass uns genauer hinschauen.

importieren

Ich habe sys importiert und wieder Standardeingaben und reguläre Ausdrücke verwendet.

import sys
import re

Variablendefinition

Definieren Sie ein Wörterbuch für jede Nummer. Der Name muss nicht HUB sein, aber es ist passiert.

HUB = {}

Das Folgende ist als Zauber vorkompiliert, um reguläre Ausdrücke schneller zu machen. Von oben nach unten reguläre Ausdrücke für Busnummern, Hubnummern und Portnummern. Der reguläre Ausdruck selbst lautet [when Perl](http://qiita.com/kouichirou/items/76dadc7cab6ef694fe18#%E5%AD%90%E3%82%B9%E3%82%AF%E3%83%AA%E3 Es ist genau das gleiche wie% 83% 97% E3% 83% 88).

reBUS  = re.compile(r'Bus (\d*)\.Port')
reHUB  = re.compile(r'^(\s*)\|__.*Port (\d*): .*Class=Hub')
rePort = re.compile(r'^(\s*)\|__.*Port (\d*): .*Driver=snd-usb-audio')

Ich werde die Details nicht erklären, aber jede Gruppe (in Klammern eingeschlossen) als Rückverweis ist enthalten. Weitere Informationen finden Sie unter hier.

Hauptroutine

zur Aussage

Dies bedeutet, dass die Standardeingabe zeilenweise verarbeitet wird.

for line in sys.stdin:

Vorerst [hier](http://webdev.bulkitem.com/python%E3%81%A7%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B%E3% 82% 92% E8% AA% AD% E3% 82% 80) Ich habe auch die Methode zum Lesen des Ganzen zuerst wie "buffer = sys.stdin.readline.splitlines ()" in Betracht gezogen Es scheint jedoch, dass die Geschwindigkeit langsam war, also hörte ich auf. (Obwohl das Ergebnis des Auffüllens der Testdaten auf ungefähr 200.000 Zeilen (was bei lsusb-t unwahrscheinlich ist) einen Unterschied von ungefähr 10% zeigte, ist beide für den praktischen Gebrauch in Ordnung.)

Inhalt von für 1 (HUB)

Überprüfen Sie zunächst den Wert von HUB. Suchen Sie die Lesezeile im vorkompilierten Objekt "reHUB". tmp ist das Objekt, das die Suchergebnisse enthält. Es wird verwendet, um den zum Zeitpunkt der Suche als Gruppe erfassten Wert als "tmp.group (1)" rückzuverweisen. Wenn das Suchergebnis ein Objekt enthält (= wenn der reguläre Ausdruck übereinstimmt), wird dem HUB-Wörterbuch ein Wert hinzugefügt. Wie im Beispiel ist der Schlüssel die Anzahl der Leerzeichen am Zeilenanfang, und der Wert ist die Zahl nach Port, der als Zeichenfolge erfasst, in den Typ int konvertiert und dann erneut als Zeichenfolge mit "." (Punkt) hinzugefügt wird.

        tmp = reHUB.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2))) + "."
                continue

Die Eingabezeichenfolge lautet beispielsweise wie folgt

    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M

Wenn ja, gibt es 4 Stellen.

HUB[len("    ")] = str(int("1")) + "."

Das heißt, "HUB [4] =" 1 "+". "". Übrigens ist der Grund, warum die Nummer auf int und str gesetzt wird, dass, wenn der Nummernteil "01" ist, das gewünschte Ergebnis, das endgültig zum Aufheben der Bindung übergeben wird, seltsam ist, zum Beispiel "01-01.01". Also bin ich in Schwierigkeiten: schwerwiegend :. Selbst wenn es sich um die Zeichenkette "01" handelt, wird sie daher zu "1", was später praktisch ist.

Fahren Sie nach dem Zuweisen des Werts fort und kehren Sie zum Kopf von for zurück.

                continue

Wenn Sie dies nicht einschließen, ist es sehr nutzlos, da nach nachfolgendem rePort und reBUS gesucht wird. Die Gesamtverarbeitung wird fast verdoppelt. Trotzdem dauert es ungefähr 1,2 Sekunden oder 0,6 Sekunden für ungefähr 200.000 Zeilen, also ... (unten weggelassen)

Inhalt von für 2 (Port)

Der Verarbeitungsinhalt ist fast der gleiche wie beim obigen Hub, der Unterschied besteht jedoch darin, dass eine Ausgabeverarbeitung stattfindet.

        tmp = rePort.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2)))
                for v in range(0,len(tmp.group(1))+1):
                        if HUB.has_key(v):
                                sys.stdout.write(HUB.get(v))
                exit()

Matching in Port Port = Sowohl BUS als auch HUB sollten bereits Werte haben. Daher wird der im HUB-Wörterbuch eingegebene Wert so oft wie nötig ausgegeben. (So viel Sie brauchen, denn wenn ein langer Zweig mit vielen HUBs in der Mitte hängt, ist der HUB so tief wie die Anzahl der HUBs.

Angenommen, in der Mitte befindet sich ein langer Zweig, und das HUB-Wörterbuch befindet sich im folgenden Status. (Wörterbuchschlüssel sollten nicht der Natur halber sortiert werden, sondern der Einfachheit halber.)

['0':'1-' , '4':'2.' , '8':'1.' , '12':'3.' , '16':'2.' , '20':'1.' ]
#Schätzen-Ist an BUS angeschlossen,.HUB ist angebracht.

Dann machen Sie ein paar Schritte

['0':'1-' , '4':'3.' , '8':'3' , '12':'3.' , '16':'2.' , '20':'1.' ]
#Schätzen-Ist an BUS angeschlossen,.HUB ist mit verbunden, und Port ist nur die Nummer ohne irgendetwas.

In dieser Situation ist es korrekt, "1-3.3" auszugeben, aber wenn alle ausgegeben werden, ist dies als "1-3.33.2.1." bedeutungslos.

Machen Sie für den Schlüssel des HUB-Wörterbuchs den Wert von 0 bis zur erforderlichen Anzahl von Ziffern (im obigen Fall bis zu 8) mit Bereich, aber da der Bereich von Python von 0 zu beginnen scheint, müssen Sie +1.

                for v in range(0,len(tmp.group(1))+1):
                        if HUB.has_key(v):
                                sys.stdout.write(HUB.get(v))

Da der Schlüssel diskrete Werte annimmt, wird er mit "has_key" überprüft, um Fehler zu vermeiden, wenn keine Werte vorhanden sind.

Inhalt von für 3 (BUS)

Endlich ist es BUS. Es ist jedoch fast das gleiche wie HUB. Der Unterschied besteht darin, dass der Schlüssel 0 ist, was ein bestimmter Punkt ist. BUS ist die höchste Ebene, sodass Sie sie nicht einzeln berechnen müssen.

        tmp = reBUS.search( line )
        if tmp:
                HUB[0] = str(int(tmp.group(1))) + "-"
                continue

Ende der Erklärung

Schnelle Geschichte von Perl und Python

Das Ergebnis von lsusb -t ist höchstens ein Dutzend Zeilen. In der Praxis spielt es also keine Rolle, welche Sie wirklich verwenden: heat_smile: Ich frage mich, wie unterschiedlich die Leistung ist, wie oben erwähnt, die Anzahl der Zielzeilen wird verschwendet. Ich habe es auf demselben Linux mit den erhöhten Fällen getestet. Es wurde auf ungefähr 200.000 Zeilen aufgeblasen, aber es macht keinen Sinn, die Anzahl der verbleibenden Zeilen zu erwähnen. Machen wir uns also nur Gedanken darüber, wie groß der Unterschied bei der gleichen Anzahl von Zeilen ist.

Als ich die Zeit des Perl-Skripts (Auszugsversion nur des entsprechenden Prozesses) mehrmals mit der Zeit gemessen habe, war es ungefähr

Perl


real    0m0.450s
user    0m0.433s
sys     0m0.031s

Es ist ein Gefühl von Zahlen. Auf der anderen Seite mit Python,

Python


real    0m0.720s
user    0m0.710s
sys     0m0.019s

Fühle mich wie. Was den Wert des Benutzers betrifft, ist Python ungefähr 1,6-mal. Es gibt einen erheblichen Unterschied.

Wenn die Anzahl der Ziellinien ungefähr einige tatsächliche Linien beträgt

Perl


real    0m0.011s
user    0m0.004s
sys     0m0.006s

Python


real    0m0.021s
user    0m0.012s
sys     0m0.009s

Ich wollte sagen. Hmm. Ich fand Perl ziemlich schwer, aber ist es etwas schneller als Python? (In diesem Prozess jedoch.)

Schnelle Geschichte nur in Python

Vorerst war ich besorgt über die Geschwindigkeit, also dachte ich über verschiedene Python-Algorithmen als solche nach.

Einfügen Weiter → Es ist schneller

Wie ich oben bereits erklärt habe, wird es schneller sein, normal zu denken. Nachdem ich etwas verarbeitet habe, gehe ich ohne zusätzliche Verarbeitung zur nächsten Zeile. Übrigens denke ich, dass es besser wäre, dies auch für die Perl-Version zu tun, aber ich wollte nicht ändern, was ich kurz schreiben könnte, also hörte ich auf, darüber nachzudenken.

Anstelle der Reihenfolge BUS, HUB, Port lautet die Reihenfolge HUB, Port, BUS → Es wurde schneller

Ich habe auch verschiedene Dinge ausprobiert, aber

――Die Anzahl der Busse ist absolut gering, der letzte ist also in Ordnung. ――Was für HUB, ich denke, es war besser, es zuerst zu bringen, da diesmal viele HUBs absichtlich in die aufgeblasenen Testdaten aufgenommen wurden. ――So Port ist in der Mitte. Es ist möglicherweise besser, die Reihenfolge von HUB und Port zu ändern, wenn nur wenige HUBs und viele Ports vorhanden sind.

Also beruhigte ich mich. Wenn es sich um eine Universitätsalgorithmusklasse handelt, wird sie durch Zählen der Zahl bewertet, aber gut, sie wird weggelassen: stick_out_tongue :.

Versuchen Sie es mit der Funktion → Es ist spät

Da die Verarbeitung in for für BUS, HUB und Port ähnlich ist, wollte ich sie nur zu einer Funktion machen. Ich musste jedoch den regulären Ausdruck von reBUS ändern, um es zu einer Funktion zu machen, und es schien, dass der neue reBUS ein Widerstand war und etwa 10% langsamer. (Außerdem ist der Ausgabeteil unvollständig, weil er in der folgenden Quelle weggelassen wurde, und es ist niedlich, dass es kein "-" oder "" gibt. Beim Ersetzen in das HUB-Wörterbuch. Es hat nicht so viele Auswirkungen.)

reBUS  = re.compile(r'^\S*(\s*)Bus (\d*)\.Port')
#reBUS  = re.compile(r'Bus (\d*)\.Port')
reHUB  = re.compile(r'^(\s*)\|__.*Port (\d*): .*Class=Hub')
rePort = re.compile(r'^(\s*)\|__.*Port (\d*): .*Driver=snd-usb-audio')

def calc(re,line):
        tmp = re.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = int(tmp.group(2))
                return True
        else:
                return False

for line in sys.stdin:
        if calc(reHUB,line):
                continue

        if calc(rePort,line):
                print HUB
                exit()

        if calc(reBUS,line):
                continue

Ich beende die Funktion, aber ich schreibe sie einfach → Es ist spät

Ich habe das vorkompilierte Objekt in ein Wörterbuch namens reS und dafür gestellt. Es sieht aus wie es schön aussieht, es sieht nicht so aus. .. Die Geschwindigkeit hat sich fast verdoppelt. Es wäre überflüssig, jedes Mal nach der Zuweisung zu dem neuen reBUS und reS und dem HUB-Wörterbuch "RE == rePort" zu überprüfen.

reS = [reBUS , rePort , reHUB ]

for line in sys.stdin:
        for RE in reS:
                tmp = RE.search( line )
                if tmp:
                        HUB[len(tmp.group(1))] = int(tmp.group(2))
                        if RE == rePort:
                                print HUB
                                exit()
                        continue

Wieder die ganze Quelle

Also habe ich verschiedene Versuche und Irrtümer ausprobiert und es ist wieder die folgende Quelle. (Wie der erste)

get_dac_port_num.py


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

import sys
import re

HUB = {}

reBUS  = re.compile(r'Bus (\d*)\.Port')
reHUB  = re.compile(r'^(\s*)\|__.*Port (\d*): .*Class=Hub')
rePort = re.compile(r'^(\s*)\|__.*Port (\d*): .*Driver=snd-usb-audio')

for line in sys.stdin:
        tmp = reHUB.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2))) + "."
                continue

        tmp = rePort.search( line )
        if tmp:
                HUB[len(tmp.group(1))] = str(int(tmp.group(2)))
                for v in range(0,len(tmp.group(1))+1):
                        if HUB.has_key(v):
                                sys.stdout.write(HUB.get(v))
                exit()

        tmp = reBUS.search( line )
        if tmp:
                HUB[0] = str(int(tmp.group(1))) + "-"
                continue

Impressionen des ersten Python

Vor kurzem habe ich Code nur in Sprachen wie PHP, Shell und Perl geschrieben, daher war ich ein wenig verärgert über die Höflichkeit von Python, wie gemunkelt. Andererseits gab es in letzter Zeit das Bewusstsein, dass ich die Typkonvertierung richtig durchführen musste und dass ich es für Anfänger nicht verstehen würde, wenn ich es so sehr als Maniac abkürzen würde. Ich konnte mit dem Gefühl daran arbeiten (?)

Ich denke, ich verwende immer noch nur die grundlegenden Funktionen von Python, daher werde ich noch einmal darüber schreiben, wenn ich in Zukunft etwas Interessantes zu studieren habe.

Schließlich

Dieses Python-Skript ist [Child Script at Perl](http://qiita.com/kouichirou/items/76dadc7cab6ef694fe18#%E5%AD%90%E3%82%B9%E3%82%AF%E3%83 % AA% E3% 83% 97% E3% 83% 88) trifft lsusb -t nicht intern. Wenn Sie es also implementieren möchten, wählen Sie "chmod ugo + x [Vollständiger Pfad des Python-Skripts]" Behalte es

/usb/bin/lsusb -t | [Vollständiger Pfad des Python-Skripts] > $UNBIND

Bitte beschreiben Sie im übergeordneten Skript wie.

Dann.

Recommended Posts

Ich möchte verhindern, dass der an den Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems bon wird (Python-Skript).
Ich möchte Python GUI ausführen, wenn Raspberry Pi startet
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
[HyperledgerIroha] Abfrage mit Python-Bibliothek
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Nachdem ich die Python-Bibliothek recherchiert hatte, verstand ich ein wenig über ei.info.
Ich möchte verhindern, dass der an den Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems bon wird (Python-Skript).
Ich möchte über die Verbindungsumgebung benachrichtigt werden, wenn RaspberryPi eine Verbindung zum Netzwerk herstellt
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich möchte ein Glas aus Python verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte Ceres Solver aus Python verwenden
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte den Fortschritt in Python anzeigen!
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders
Übergeben von Argumenten beim Aufrufen von Python-Skripten über Blender in der Befehlszeile
Vom Einrichten des Raspberry Pi bis zur Installation der Python-Umgebung
Ich möchte den Dateinamen von DataLoader sehen
Verwendung von Raspeye Relay Module Python
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte R-Datensatz mit Python verwenden
Ich möchte am Ende etwas mit Python machen
[Selenium] Ich möchte den Browser anzeigen, indem ich den Treiber auf dem Host-Betriebssystem von WSL aus drücke
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird
maya Python Ich möchte die gebackene Animation wieder reparieren.
Ich möchte viele Prozesse von Python aus starten
Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte Interrupts auf dem Raspberry Pi deaktivieren (≒ DI / EI)
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte die Natur von Python und Pip kennenlernen
Ändern Sie die Meldung, die beim Anmelden bei Raspberry Pi angezeigt wird
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
So gehen Sie mit dem Problem um, dass das aktuelle Verzeichnis verschoben wird, wenn Python von Atom ausgeführt wird
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
[Linux] Ich möchte das Datum wissen, an dem sich der Benutzer angemeldet hat
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Verwenden Sie Python auf Raspberry Pi 3, um die LED zu beleuchten (Hello World)
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
[Python] Was tun, wenn beim Importieren aus dem zu sys.path hinzugefügten Verzeichnis gegen PEP8 verstoßen wird?
Ich möchte die Anzahl von num_boost_round anzeigen, wenn Early_stopping mithilfe des XGBoost-Rückrufs angewendet wird (nicht erreicht).
Lesen Sie die Daten des NFC-Lesegeräts, das mit Python an Raspberry Pi 3 angeschlossen ist, und senden Sie sie mit OSC an openFrameworks