Après tout, il est faux de chat avec le sous-processus python.

Yaharo.

emballer

Si vous écrivez subprocess.run ('cat path', shell = True) en python, repentez-vous avec moi et utilisez ʻopen () `à partir de demain.

Qu'est-ce que le "sous-processus"

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.

Quelle est la vitesse de ʻopen () `

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.

finalement

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

Après tout, il est faux de chat avec le sous-processus python.
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Si vous essayez d'installer Python2 pip après avoir installé Python3 pip et qu'il est rejeté
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Le calcul d'une question d'examen d'entrée était difficile à penser, alors j'ai laissé ça à python après tout
Quel est l'outil de visualisation Python le plus populaire après tout?
Lorsqu'il est difficile de configurer un serveur SMTP localement lors de l'envoi de courrier avec Python.
Connectez-vous à BigQuery avec Python
Est-il possible de détecter des images similaires uniquement avec ImageHash?
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Après tout, qui est l'intégration?
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
C'est Halloween donc je vais essayer de le cacher avec Python
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
[Confrontation! Puissance humaine vs Python] Après tout, ce qui est plus rapide, résoudre les mathématiques du test central avec Python ou le résoudre par vous-même?
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
[Python] Qu'est-ce que pip? Expliquez la liste des commandes et comment l'utiliser avec des exemples réels
Le framework de Deep Learning de Microsoft "CNTK" est désormais compatible avec Python, ce qui le rend beaucoup plus facile à utiliser
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
Activé pour convertir PNG en JPG avec Pillow of Python
N'écrivez pas Python si vous voulez l'accélérer avec Python
Quand il est difficile de copier ce que vous avez construit avec vue
Exemple à utiliser après l'authentification OAuth de l'API BOX avec Python
Comment utiliser l'astérisque (*) en Python. C'est peut-être tout? ..
J'ai essayé de savoir si ReDoS est possible avec Python
Comment utiliser Python avec Jw_cad (Partie 1 Qu'est-ce que la transformation externe)
Convertir un script Python écrit dans PyTorch en exe avec PyInstaller
Que dois-je faire avec la structure de répertoires Python après tout?
[Python] Qu'est-ce qu'une instruction with?
Python: comment utiliser async avec
Lien pour commencer avec python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python
Sortie vers un fichier csv avec Python
Après tout, qu'est-ce que la modélisation statistique?
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
Pour faire une récursion avec Python2
Comment démarrer avec Python
Que faire avec la sortie de PYTHON?
Comment calculer la date avec python
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
Exécution parallèle facile avec le sous-processus python
[TCP / IP] Après avoir étudié, essayez de créer un client HTTP avec Python
Je veux le faire avec Python lambda Django, mais je vais m'arrêter
Je veux tweeter Twitter avec Python, mais j'y suis accro
Avec PEP8 et PEP257, un codage Python qui n'est pas gênant à montrer aux gens!
Lorsque vous souhaitez l'utiliser tel quel lorsque vous l'utilisez avec lambda memo
Il est préférable d'utiliser Weight Initializer lors de l'initialisation avec HeNormal avec Chainer
Utilisez Python de Java avec Jython. J'étais aussi accro.
Si pip s'arrête à cause de SSL, il est préférable de réinstaller python lui-même
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python