2012-01-16 2 views
5

Я хочу выполнить следующую команду Баш в Python 3:питон выход подпроцесс в список или файл

ls -l 

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

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

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

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

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

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

+1

Если вы хотите для доступа к информации о файле/директории вы можете проверить встроенную библиотеку 'os': [документация] (http://docs.python.org/py3k/library/os.html). –

ответ

8

Один из способов доступа к информации, содержащейся в 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>'} 
+0

Я получаю: 'File 'ip4.py" , строка 16 строка печати ^ SyntaxError: недействительный синтаксис – beoliver

+0

@ user969617 Да, извините, это было для python 2.x, а не для python 3, как вы просили. Я обновил код для работы на python 3. – jcollado

+0

это выглядит многообещающим !!! Мой следующий вопрос (пожалуйста, расскажите мне, это мой второй день python), как я могу получить доступ к информации из каждого словаря. Нужно ли им давать им уникальные имена? Скажем, я хочу переписать дату с помощью электронной таблицы. – beoliver

0
from subprocess import Popen, PIPE 
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] 

После этого вы можете делать все, что хотите. См python docs для подробной документации

+0

Спасибо. Я тоже пробовал это, но был смущен отсутствием форматирования ...Я использовал для работы с bash & awk, где вывод печати, а затем с помощью 'awk '{print $ n;}'' позволяет вам перейти к столбцам и 'awk NR = $ variable' позволяет вам выбирать строки. В какой части я должен смотреть? – beoliver

+0

@Gary указывает на хороший способ сделать это для Python2.7 +. Используйте это, если можете: – Wesley

18

С 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() 
1

Подробнее о Попене. набор вы просили вас получить с

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

также прочитать

read subprocess stdout line by line

4

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

import os 
files = os.listdir('/path/to/dir') 
for file in files: 
    print(file) 
+0

Я действительно хочу перечислить таблицы аэропортов, но подумал, что я бы использовал простой пример. Фактический вывод будет 'call (['/ System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-s'])' – beoliver

Смежные вопросы