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.
Bitte überprüfen Sie Ich möchte verhindern, dass der an Raspberry Pi (jessie) angeschlossene Lautsprecher beim Neustart des Betriebssystems fehlerfrei wird (Perl-Skript).
Lass uns jetzt gehen.
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.
Ich habe sys importiert und wieder Standardeingaben und reguläre Ausdrücke verwendet.
import sys
import re
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.
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.)
Ü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)
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.
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
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.)
Vorerst war ich besorgt über die Geschwindigkeit, also dachte ich über verschiedene Python-Algorithmen als solche nach.
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.
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 :.
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 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
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
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.
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.