Je veux exécuter un programme en ligne de commande à partir d'un script python et obtenir la sortie.
Comment puis-je obtenir les informations affichées par foo afin de pouvoir les utiliser dans mon script?
Par exemple, j'appelle foo file1
À partir de la ligne de commande et il s'imprime
Size: 3KB
Name: file1.txt
Other stuff: blah
Comment puis-je obtenir le nom de fichier en faisant quelque chose comme filename = os.system('foo file1')
?
Utilisez le module de sous-processus:
import subprocess
command = ['ls', '-l']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE)
text = p.stdout.read()
retcode = p.wait()
Ensuite, vous pouvez faire ce que vous voulez avec la variable text
: expression régulière, fractionnement, etc.
Les 2e et 3e paramètres de subprocess.Popen
sont facultatifs et peuvent être supprimés.
Le moyen le plus simple d'obtenir la sortie d'un outil appelé via votre script Python est d'utiliser le module sous-processus dans la bibliothèque standard. Jetez un œil à subprocess.check_output .
>>> subprocess.check_output("echo \"foo\"", Shell=True)
'foo\n'
(Si votre outil reçoit des entrées de sources non fiables, veillez à ne pas utiliser le Shell=True
argument.)
Il s'agit généralement d'un sujet pour un script bash que vous pouvez exécuter dans python:
#!/bin/bash
# vim:ts=4:sw=4
for arg; do
size=$(du -sh "$arg" | awk '{print $1}')
date=$(stat -c "%y" "$arg")
cat<<EOF
Size: $size
Name: ${arg##*/}
Date: $date
EOF
done
Edit: Comment l'utiliser: ouvrez un pseuso-terminal, puis copiez-collez ceci:
cd
wget http://pastie.org/pastes/2900209/download -O info-files.bash
En python2.4:
import os
import sys
myvar = ("/bin/bash ~/info-files.bash '{}'").format(sys.argv[1])
myoutput = os.system(myvar) # myoutput variable contains the whole output from the Shell
print myoutput
Ceci est une solution portable en pur python:
import os
import stat
import time
# pick a file you have ...
file_name = 'll.py'
file_stats = os.stat(file_name)
# create a dictionary to hold file info
file_info = {
'fname': file_name,
'fsize': file_stats [stat.ST_SIZE],
'f_lm': time.strftime("%m/%d/%Y %I:%M:%S %p",time.localtime(file_stats[stat.ST_MTIME])),
}
print("""
Size: {} bytes
Name: {}
Time: {}
"""
).format(file_info['fsize'], file_info['fname'], file_info['f_lm'])
En Python, vous pouvez passer une commande OS simple avec des espaces, des sous-guillemets et des retours à la ligne dans le module subcommand
afin que nous puissions analyser le texte de la réponse comme ceci:
Enregistrez-le dans test.py:
#!/usr/bin/python
import subprocess
command = ('echo "this echo command' +
' has subquotes, spaces,\n\n" && echo "and newlines!"')
p = subprocess.Popen(command, universal_newlines=True,
Shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
text = p.stdout.read()
retcode = p.wait()
print text;
Ensuite, lancez-le comme ceci:
python test.py
Qui imprime:
this echo command has subquotes, spaces,
and newlines!
Si cela ne fonctionne pas pour vous, cela pourrait être des problèmes avec la version python ou le système d'exploitation. J'utilise Python 2.7.3 sur Ubuntu 12.10 pour cet exemple.