Yaharo.
Wenn Sie "subprocess.run (" cat path ", shell = True)" in Python schreiben, bereuen Sie es mit mir und verwenden Sie "open ()" von morgen.
Wenn Sie damit vertraut sind, überspringen Sie es bitte.
subprocess
ist ein Modul, das Linux-Betriebssystembefehle von Python aus ausführt.
Es gibt Betriebssystem- und Systemfunktionen zum Ausführen von Betriebssystembefehlen unter Python, aber es scheint, dass derzeit ein Unterprozess empfohlen wird.
import subprocess
list = subprocess.run('ls')
#hoge.py hoge.sh hoge.wav
print(list)
#CompletedProcess(args='ls', returncode=0)
#Wenn Sie einen Befehl als Argument übergeben, wird das Ausführungsergebnis (Status) zurückgegeben.
list = subprocess.run('ls', encoding='utf-8', stdout=subprocess.PIPE).stdout
print(list)
#hoge.py
#hoge.sh
#hoge.wav
#utf durch Angabe der Codierung-Kann mit 8 usw. codiert werden.
#Sie können die Ausgabe an die Standardausgabe übergeben, indem Sie das Attribut stdout angeben
list = subprocess.run('ls -a', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout
print(list)
#.hoge
#hoge.py
#hoge.sh
#hoge.wav
#shell=Sie können Leerzeichen einschließen, indem Sie True angeben. Es besteht jedoch das Risiko einer Befehlsinjektion usw.
Sie können verschiedene Betriebssystembefehle wie diesen ausführen, der Prozess ist jedoch langsam, da jedes Mal ein Unterprozess erstellt wird. Das Bild ist, dass Eltern sich die Mühe machen, ein Kind zur Welt zu bringen, um ein Buch zu lesen und das Kind vorlesen zu lassen. Wenn Sie es selbst lesen, können Sie es lösen, aber es ist verständlich, dass es schwer ist.
Lesen Sie übrigens die Option stdout = subprocess.PIPE
vor! Es bedeutet.
Eltern können nicht wissen, was das Kind liest (es sei denn, sie können ihre Gedanken mit dem sechsten Sinn lesen), aber sie können es wissen, indem sie es vorlesen.
Obwohl es in diesem Artikel beschrieben wird, ist es ein sehr praktisches Modul. Wenn Sie neu darin sind, verwenden Sie es bitte. ~~ Die Verarbeitung ist für den normalen Gebrauch nicht so schwer. ~~ (Plan Zusammenbruch)
cat
war in subprocess
dummWie oben erwähnt, können Sie den Textinhalt von hogehoge.txt abrufen, indem Sie "subprocess.run" ("cat /hogehoge.txt", shell = True) "ausführen. Sie können jedoch einen Unterprozess starten, um nur den Text abzurufen. Da es ausgelöst wird, ist die Verarbeitung langsam. Sie können eine integrierte Funktion namens "open ()" verwenden, um eine Datei in Python zu öffnen. Verwenden wir diese Funktion. Es ist sehr rudimentär, aber ich wusste nicht, wie ich es einfach benutzen sollte.
with open('/hogehoge.txt') as f:
hoge = f.read()
print(hoge)
#/hogehoge.Der Text von txt wird angezeigt
Alles, was mit "open ()" geöffnet wird, muss mit "close ()" geschlossen werden, daher verwende ich "with", um sicherzustellen, dass ich nicht vergesse, es zu schließen. Nach dem Schließen von "open ()" kann nicht mehr auf die Datei verwiesen werden, sondern auf die zugewiesene Variable. Weitere Informationen finden Sie unter Offizielle Dokumentation.
open ()
Ich habe das folgende Skript geschrieben und es überprüft.
#!/usr/bin/python3.7
import subprocess
import time
#open()
start = time.time() #Startzeit bekommen
for i in range(1000): #1000 mal wiederholen
with open('/sys/class/thermal/thermal_zone0/temp') as f: #Datei öffnen
test = f.read() #Ersetzen Sie den Text in der Datei
elapsed_time = time.time() - start #Holen Sie sich die Endzeit und finden Sie den Unterschied zur Startzeit
print("Open: {}s".format(elapsed_time)) #Verstrichene Zeit aufschreiben
#subprocess
start = time.time()
for i in range(1000):
test = subprocess.run('cat /sys/class/thermal/thermal_zone0/temp', shell=True, stdout=subprocess.PIPE).stdout
elapsed_time = time.time() - start
print("Subprocess: {}s".format(elapsed_time))
#vcgencmd im Unterprozess (Referenzdatensatz zur CPU-Temperatur)
start = time.time()
for i in range(1000):
test = subprocess.run('vcgencmd measure_temp', shell=True, stdout=subprocess.PIPE).stdout
elapsed_time = time.time() - start
print("Vcgencmd: {}s".format(elapsed_time))
Das Ausführungsergebnis ist wie folgt.
Open: 0.08225083351135254s
Subprocess: 5.188024044036865s
Vcgencmd: 6.032892465591431s
Was meinst du! Der Teilprozess, der so langsam war, ist jetzt mehr als 50 Mal schneller.
Ich denke, dass die Aufschlüsselung der verstrichenen Zeit wahrscheinlich die Standby-Zeit ist, daher kann ich nicht einfach über die CPU-Auslastung sagen, aber es fühlt sich auf jeden Fall so an, als würde ich von einem separaten Fenster aus überwachen.
Wenn Sie es mehrmals ausführen, gibt es einige Variationen, aber wenn es so unterschiedlich ist, sollten Sie open ()
verwenden.
Übrigens wird in "subprocess.run" die Verarbeitung des übergeordneten Prozesses gestoppt, bis der untergeordnete Prozess endet. Mit "subprocess.Popen" kann der untergeordnete Prozess jedoch in den Hintergrund gestellt und eine parallele Verarbeitung durchgeführt werden.
Selbst wenn Sie subprocess.Popen
verwenden, hat die obige Überprüfung ungefähr 2 Sekunden gedauert, sodass es keinen Zweifel gibt, dass open ()
schnell ist, aber der Unterschied kann sich je nach Situation verringern.
In jedem Fall besteht der Zweck dieser Zeit darin, eine Textdatei zu erhalten, daher möchte ich Parallelität vermeiden ...
Diese Überprüfung wird durch die Verbesserung des Skripts ausgelöst, das im Artikel Messen der CPU-Temperatur von Raspeye mit Python behandelt wird. Überprüfen Sie es daher mit "vcgencmd" als Referenz. Ich versuchte es. Die Ausgabe von "vcgencmd" ist so formatiert, dass der Temperaturwert besser lesbar ist, sodass er um diesen Betrag als langsamer angesehen wird.
[Zusatz] Basierend auf dem Inhalt dieses Artikels habe ich [Skript zur Überwachung der CPU mit Python] geschrieben (https://qiita.com/genshibangou16/items/90021d4fb65577e954c9).
Ich war überrascht, einen deutlicheren Unterschied zu sehen, als ich erwartet hatte. Ich möchte immer mehr lernen und Programme schreiben können, die sich "der richtigen Person am richtigen Ort" bewusst sind.