Как получить данные из командной строки из программы Python? - PullRequest
23 голосов
/ 21 ноября 2011

Я хочу запустить программу командной строки из скрипта Python и получить вывод.

Как получить информацию, отображаемую foo, чтобы я мог использовать ее в своем скрипте?

Например, я вызываю foo file1 из командной строки, и он печатает

Size: 3KB
Name: file1.txt
Other stuff: blah

Как я могу получить имя файла, делая что-то вроде filename = os.system('foo file1')?

Ответы [ 5 ]

23 голосов
/ 21 ноября 2011

Используйте модуль подпроцесса:

import subprocess

command = ['ls', '-l']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE)
text = p.stdout.read()
retcode = p.wait()

Затем вы можете делать с переменной text все, что захотите: регулярное выражение, разбиение и т. Д.

2-й и 3-й параметры subprocess.Popen являются необязательными и могут быть удалены.

4 голосов
/ 21 ноября 2011

Самый простой способ получить выходные данные инструмента, вызываемого через скрипт Python, - это использовать модуль subprocess в стандартной библиотеке.Посмотрите на subprocess.check_output .

>>> subprocess.check_output("echo \"foo\"", shell=True)
'foo\n'

(Если ваш инструмент получает данные из ненадежных источников, убедитесь, что вы не используете аргумент shell=True.)

2 голосов
/ 21 ноября 2011

Обычно это тема для bash-скрипта, который вы можете запустить на 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

Редактировать: Как это использовать : открыть псевдо-терминал, затем скопировать и вставить это:

cd
wget http://pastie.org/pastes/2900209/download -O info-files.bash

В 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
1 голос
/ 08 декабря 2013

В Python вы можете передать простую команду ОС с пробелами, под кавычками и символами новой строки в модуль subcommand, чтобы мы могли проанализировать текст ответа следующим образом:

  1. Сохранить это в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. Затем запустите его так:

    python test.py 
    
  3. Который печатает:

    this echo command has subquotes, spaces,
    
    
    and newlines!
    

Если это не работает для вас, это может быть проблема с версией Python или операционной системой.Для этого примера я использую Python 2.7.3 в Ubuntu 12.10.

1 голос
/ 22 ноября 2011

Это портативное решение на чистом питоне:

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