web-dev-qa-db-fra.com

Comment obtenir des données de la ligne de commande à partir d'un programme Python?

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')?

29
user1058492

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.

23
koblas

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

5
josePhoenix

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
2
Gilles Quenot

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'])
1
Gilles Quenot

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:

  1. 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;
    
  2. Ensuite, lancez-le comme ceci:

    python test.py 
    
  3. 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.

1
Eric Leschinski