Immerhin ist es falsch, mit Python-Subprozess zu katzen.

Yaharo.

einpacken

Wenn Sie "subprocess.run (" cat path ", shell = True)" in Python schreiben, bereuen Sie es mit mir und verwenden Sie "open ()" von morgen.

Was ist "Unterprozess"?

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 dumm

Wie 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.

Wie schnell ist 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).

Schließlich

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.

Recommended Posts

Immerhin ist es falsch, mit Python-Subprozess zu katzen.
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Wenn Sie versuchen, Python2 pip nach der Installation von Python3 pip zu installieren, wird dies abgelehnt
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Die Mathematik einer Frage zur Aufnahmeprüfung war umständlich, deshalb überließ ich sie schließlich Python
Welches ist schließlich das beliebteste Python-Visualisierungstool?
Wenn es schwierig ist, beim Senden von E-Mails mit Python lokal einen SMTP-Server einzurichten.
Stellen Sie mit Python eine Verbindung zu BigQuery her
Ist es möglich, ähnliche Bilder nur mit ImageHash zu erkennen?
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Wer ist Embedding?
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Es ist Halloween, also werde ich versuchen, es mit Python zu verstecken
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
[Konfrontation! Menschliche Kraft gegen Python] Was ist schließlich schneller, wenn Sie die Mathematik des Zentraltests mit Python lösen oder selbst lösen?
[Python] Was ist ein Slice? Eine leicht verständliche Erklärung zur Verwendung anhand eines konkreten Beispiels
[Python] Was ist Pip? Erläutern Sie die Befehlsliste und deren Verwendung anhand aktueller Beispiele
Das Deep Learning-Framework "CNTK" von Microsoft ist jetzt mit Python kompatibel, was die Verwendung erheblich vereinfacht
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
Aktiviert, um PNG mit Pillow of Python in JPG zu konvertieren
Schreiben Sie Python nicht, wenn Sie es mit Python beschleunigen möchten
Wenn es schwierig ist, das zu kopieren, was Sie mit vue erstellt haben
Beispiel zur Verwendung nach OAuth-Authentifizierung der BOX-API mit Python
Verwendung von Sternchen (*) in Python. Vielleicht ist das alles? ..
Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist
Verwendung von Python mit Jw_cad (Teil 1 Was ist externe Transformation)
Konvertieren Sie in PyTorch geschriebenes Python-Skript mit PyInstaller in exe
Was soll ich denn mit der Python-Verzeichnisstruktur machen?
[Python] Was ist eine with-Anweisung?
Python: So verwenden Sie Async mit
Link, um mit Python zu beginnen
[Python] Mit Python in eine CSV-Datei schreiben
Schön dich mit Python zu treffen
Versuchen Sie, Facebook mit Python zu betreiben
Ausgabe in eine CSV-Datei mit Python
Was ist statistische Modellierung?
Konvertieren Sie die Liste mit Python in DataFrame
MP3 → WAV-Konvertierung mit Python
Schwanzrekursion mit Python2 durchführen
Erste Schritte mit Python
Was tun mit PYTHON Release?
So berechnen Sie das Datum mit Python
Mit Python 3 einfach auf Twitter posten
Ich möchte mit Python debuggen
Einfache parallele Ausführung mit Python-Unterprozess
[TCP / IP] Versuchen Sie nach dem Studium, mit Python einen HTTP-Client zu erstellen
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Mit PEP8 und PEP257 ist es nicht peinlich, Python-Codierung zu zeigen!
Wenn Sie es so verwenden möchten, wie es ist, wenn Sie es mit Lambda-Memo verwenden
Es ist besser, den Weight Initializer zu verwenden, wenn Sie mit HeNormal mit Chainer initialisieren
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Wenn pip aufgrund von SSL stoppt, ist es besser, Python selbst neu zu installieren
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen