Как получить данные из командной строки из программы Python?

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

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

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

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

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

Ответы

Ответ 1

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

import subprocess

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Изменить: как использовать его: откройте pseuso-terminal, затем скопируйте-вставьте это:

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

Ответ 4

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

  • Сохраните это в 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;
    
  • Затем запустите его следующим образом:

    python test.py 
    
  • Какие принты:

    this echo command has subquotes, spaces,
    
    
    and newlines!
    

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

Ответ 5

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

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