Как получить данные из командной строки из программы 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'])