вывод подпроцесса python в список или файл - PullRequest
6 голосов
/ 16 января 2012

Я хочу запустить следующую команду bash в Python 3:

ls -l

Я знаю, что могу сделать следующее:

from subprocess import call
call(['ls', '-l'])

Как сохранить этот вывод вфайл или поместить его в списки или наборы?

[-rw-r--r--]  [1] [name]  [staff]   [426] [14 Jan 21:52] [HelloWorld.class]
[-rw-r--r--@] [1] [name]  [staff]   [107] [14 Jan 21:51] [HelloWorld.java]
...
etc.

Я хочу иметь возможность доступа к определенной информации напрямую, а затем добавить ее в набор, но я не знаю, сколько элементов будет перечислено.

Любые подсказки, фрагменты или примеры действительно помогут.

Ответы [ 5 ]

22 голосов
/ 16 января 2012

С python2.7 вы можете использовать subprocess.check_output :

ls_lines = subprocess.check_output(['ls', '-l']).splitlines()

До Python2.7 вам нужно использовать API нижнего уровня, который немного более сложен.

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
ls_proc.wait()
# check return code
ls_lines = ls_proc.stdout.readlines()
10 голосов
/ 16 января 2012

Один из способов доступа к информации в выводе ls -l - ее анализ.Например, csv.DictReader можно использовать для сопоставления каждого столбца с полем в словаре:

import subprocess
import csv

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

reader = csv.DictReader(stdout.decode('ascii').splitlines(),
                        delimiter=' ', skipinitialspace=True,
                        fieldnames=['permissions', 'links',
                                    'owner', 'group', 'size',
                                    'date', 'time', 'name'])

for row in reader:
    print(row)

Приведенный выше код выведет словарь для каждой строки в выводе ls -l, например:

{'group': '<group_name>',
 'name': '<filename>',
 'links': '1',
 'date': '<modified_date>',
 'time': '<modified_time>',
 'owner': '<user_name>',
 'permissions': '-rw-rw-r--',
 'size': '<size>'}
7 голосов
/ 16 января 2012

Если вы действительно хотите перечислить каталог, используйте os.listdir

import os
files = os.listdir('/path/to/dir')
for file in files:
    print(file)
1 голос
/ 16 января 2012

Читайте о Попене. набор, который вы просили, вы получаете с

import subprocess
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
myset=set(proc.stdout)

или сделать что-то вроде

for x in proc.stdout : print x

и то же самое для stderr

Вы можете проверить состояние процесса с помощью

proc.poll() 

или дождитесь завершения с

proc.wait()

также читайте

читать стандартный вывод подпроцесса построчно

0 голосов
/ 16 января 2012
from subprocess import Popen, PIPE
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

Затем вы можете делать с выходом все, что захотите.См. Python Docs для подробной документации

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