Il existe de nombreuses façons de gérer les commandes Linux à partir de Python, mais la meilleure façon est d'utiliser la classe Popen
, qui peut gérer la sortie standard et la sortie d'erreur standard de manière structurelle.
Nom de la fonction | Classification | Moule |
---|---|---|
Popen().stdout.readline() | Sortie d'une seule ligne à partir du résultat de sortie standard | str |
Popen().stdout.readlines() | Sortie standard Sortie de tous les résultats sous forme de tableau | list[str] |
Popen().stderr.readline() | Sortie d'erreur standard Une seule ligne est sortie du résultat | str |
Popen().stderr.readlines() | Sortie d'erreur standard Sortie de tous les résultats sous forme de tableau | list[str] |
output.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from subprocess import PIPE, Popen
def cmdline(command):
"""
Exécutez une commande. coquille=Si True, exécutez via le shell.
:param command: str
:return: Popen
"""
return Popen(
args=command,
stdout=PIPE,
stderr=PIPE,
shell=True
)
#Sortie standard
print 'Sortie standard:' + cmdline('date').stdout.readline()
#Sortie d'erreur standard
print 'Sortie d'erreur standard: ' + cmdline('echo 2015|xargs wc -l').stderr.readline()
Résultat d'exécution
>>> python output.py
Sortie standard:Lundi 7 décembre 2015 18:47:09 JST
Sortie d'erreur standard: wc: 2015: open: No such file or directory
git.py
#imprimer le dernier hachage de commit de git
print cmdline('git log --oneline').stdout.readline()
#Imprimer le dernier hachage de validation à partir d'un autre référentiel
print cmdline('cd ~/pypi/cf_recommender/ && git log --oneline').stdout.readline()
Résultat d'exécution
>>> python git.py
6a2ae0a xlsx update by automatic
a2febc4 update readme
chat.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from subprocess import PIPE, Popen
def cmdline(command):
"""
Exécuter une commande
:param command: str
:return: Popen
"""
return Popen(
args=command,
stdout=PIPE,
stderr=PIPE,
shell=True
)
def chat(message):
#Montage factice
print 'ERROR:' + message
#Notifier le contenu de l'erreur par chat lorsque l'erreur standard est sortie
cmd = [
'python manage.py test_json',
'python manage.py test_battle',
]
#Préfixe d'exécution de la commande, &&Enchaîner plusieurs commandes avec
prefix = 'cd ~/application/ && {}'
for _cmd in cmd:
command = prefix.format(_cmd)
p = cmdline(command)
print 'command:' + command
#Notifier par chat quand une sortie d'erreur standard existe
errors = p.stderr.readlines()
if errors:
error_message = ''.join(errors)
chat(error_message)
Résultat d'exécution
command:cd ~/application/ && python manage.py test_json
ERROR:Traceback (most recent call last):
File "manage.py", line 10, in <module>
...
IOError: [Errno 2] No such file or directory: u'..../test.json'
command:cd ~/application/ && python manage.py test_battle
Je suis sûr qu'il y a des gens qui connaissent des moyens plus pratiques (・ ㅂ ・) و
Recommended Posts