Yaharo.
Si vous écrivez subprocess.run ('cat path', shell = True)
en python, repentez-vous avec moi et utilisez ʻopen () `à partir de demain.
Si vous le connaissez, veuillez l'ignorer.
subprocess
est un module qui exécute les commandes du système d'exploitation Linux à partir de python.
Il existe une fonction os et une fonction système pour exécuter des commandes OS sur Python, mais il semble que sous-processus
soit actuellement recommandé.
import subprocess
list = subprocess.run('ls')
#hoge.py hoge.sh hoge.wav
print(list)
#CompletedProcess(args='ls', returncode=0)
#Si vous passez une commande en argument, le résultat de l'exécution (statut) sera renvoyé.
list = subprocess.run('ls', encoding='utf-8', stdout=subprocess.PIPE).stdout
print(list)
#hoge.py
#hoge.sh
#hoge.wav
#utf en spécifiant l'encodage-Peut être encodé avec 8 etc.
#Vous pouvez transmettre la sortie à la sortie standard en spécifiant l'attribut stdout
list = subprocess.run('ls -a', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout
print(list)
#.hoge
#hoge.py
#hoge.sh
#hoge.wav
#shell=Vous pouvez inclure des espaces en spécifiant True, mais il y a un risque d'injection de commande, etc.
Vous pouvez exécuter diverses commandes du système d'exploitation comme celle-ci, mais le processus est lent car un sous-processus est créé à chaque fois. L'image est comme un parent donnant naissance à un enfant pour lire un livre et le faire lire à haute voix. Si vous le lisez vous-même, vous pouvez le résoudre, mais il est compréhensible qu'il soit lourd.
Au fait, lisez à haute voix l'option de stdout = subprocess.PIPE
! Ça veut dire.
Les parents ne peuvent pas savoir ce que l'enfant lit (à moins qu'ils ne puissent lire leurs pensées avec le sixième sens), mais ils peuvent le savoir s'ils le lisent à haute voix.
Bien qu'il soit disséqué dans cet article, c'est un module très pratique, donc si vous êtes nouveau dans ce domaine, veuillez l'utiliser. ~~ Le traitement n'est pas si lourd pour une utilisation normale. ~~ (Réduire le plan)
cat
était stupide dans sous-processus
Comme mentionné ci-dessus, vous pouvez obtenir le contenu texte de hogehoge.txt en faisant subprocess.run ('cat /hogehoge.txt', shell = True)
, mais vous pouvez démarrer un sous-processus juste pour extraire le texte. Puisqu'il est déclenché, le traitement sera lent.
Vous pouvez utiliser une fonction intégrée appelée ʻopen () `pour ouvrir un fichier en Python, alors utilisons-la.
C'est très rudimentaire, mais je ne savais pas comment l'utiliser facilement.
with open('/hogehoge.txt') as f:
hoge = f.read()
print(hoge)
#/hogehoge.Le texte du txt s'affiche
Puisque tout ce qui est ouvert avec ʻopen () doit être fermé avec
close () , nous utilisons
withpour éviter d'oublier de le fermer. Après avoir fermé ʻopen ()
, le fichier ne peut plus être référencé, mais la variable affectée peut être référencée.
Voir Documentation officielle pour plus d'informations.
J'ai écrit le script suivant et l'ai vérifié.
#!/usr/bin/python3.7
import subprocess
import time
#open()
start = time.time() #Obtenir l'heure de début
for i in range(1000): #Répétez 1000 fois
with open('/sys/class/thermal/thermal_zone0/temp') as f: #Fichier ouvert
test = f.read() #Texte de remplacement dans le fichier
elapsed_time = time.time() - start #Obtenez l'heure de fin et trouvez la différence par rapport à l'heure de début
print("Open: {}s".format(elapsed_time)) #Écrire le temps écoulé
#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 dans le sous-processus (enregistrement de référence concernant la température du processeur)
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))
Le résultat de l'exécution est le suivant.
Open: 0.08225083351135254s
Subprocess: 5.188024044036865s
Vcgencmd: 6.032892465591431s
Que voulez-vous dire! Le sous-processus, qui était si lent, est maintenant plus de 50 fois plus rapide.
Je pense que la ventilation du temps écoulé est probablement le temps de veille, donc je ne peux pas simplement parler de la charge du processeur, mais j'ai certainement l'impression que je surveillais à partir d'une fenêtre séparée. Si vous l'exécutez plusieurs fois, il y aura des variantes, mais si c'est si différent, vous voudrez utiliser ʻopen () `.
En passant, dans subprocess.run
, le traitement du processus parent est arrêté jusqu'à ce que le processus enfant se termine, mais en utilisant subprocess.Popen
, le processus enfant peut être tourné vers l'arrière-plan et un traitement parallèle peut être effectué.
Même si vous utilisez subprocess.Popen
, cela a pris environ 2s dans la vérification ci-dessus, donc il n'y a aucun doute que ʻopen ()` est rapide, mais la différence peut être réduite selon la situation.
Dans tous les cas, le but de cette fois est d'obtenir un fichier texte, donc je veux éviter le parallélisme ...
Cette vérification est déclenchée par l'amélioration du script traité dans l'article Mesurer la température du CPU de Raspeye avec Python, donc vérifiez-le avec vcgencmd
comme référence. Je l'ai essayé.
La sortie de vcgencmd
est formatée pour que la valeur de température soit plus lisible, donc elle est considérée comme plus lente de cette quantité.
[Une addition] Sur la base du contenu de cet article, j'ai écrit Script pour surveiller le CPU avec Python.
J'ai été surpris de voir une différence plus claire que ce à quoi je m'attendais. Je veux étudier de plus en plus et être capable d'écrire des programmes qui soient conscients de "la bonne personne au bon endroit".
Recommended Posts