2012-01-16 24 views
5

Tôi muốn chạy lệnh bash sau bằng Python 3:trăn đầu ra tiến trình con để liệt kê hoặc nộp

ls -l 

Tôi biết rằng tôi có thể làm như sau:

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

Làm thế nào để tiết kiệm này đầu ra cho một tập tin, hoặc đặt nó vào danh sách hoặc bộ?

[-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. 

Tôi muốn có thể truy cập thông tin cụ thể trực tiếp, sau đó thêm thông tin vào bộ, nhưng tôi không biết có bao nhiêu mục sẽ được liệt kê.

Bất kỳ gợi ý, đoạn trích hoặc ví dụ nào thực sự hữu ích.

+1

Nếu bạn muốn để truy cập thông tin về tệp/dir, bạn có thể muốn kiểm tra thư viện 'os' tích hợp sẵn: [documentation] (http://docs.python.org/py3k/library/os.html). –

Trả lời

8

Một cách để truy cập vào các thông tin trong ls -l đầu ra được phân tích nó. Ví dụ, csv.DictReader có thể được sử dụng để ánh xạ mỗi cột để một trường trong một cuốn từ điển:

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) 

Đoạn mã trên sẽ in một cuốn từ điển cho mỗi dòng trong ls -l đầu ra như:

{'group': '<group_name>', 
'name': '<filename>', 
'links': '1', 
'date': '<modified_date>', 
'time': '<modified_time>', 
'owner': '<user_name>', 
'permissions': '-rw-rw-r--', 
'size': '<size>'} 
+0

Tôi nhận được: 'File" ip4.py " , dòng 16 Hàng in ^ Cú phápError: cú pháp không hợp lệ ' – beoliver

+0

@ user969617 Có, xin lỗi, đó là dành cho python 2.x, không dùng cho python 3 như bạn đã hỏi. Tôi đã cập nhật mã để làm việc cho python 3. – jcollado

+0

điều này có vẻ đầy hứa hẹn !!! Câu hỏi tiếp theo của tôi (xin vui lòng trần với tôi, đó là ngày thứ hai của tôi về python) là làm thế nào để tôi sau đó truy cập thông tin từ mỗi từ điển. Tôi có cần phải cung cấp cho họ những cái tên độc đáo không? Giả sử tôi muốn tham chiếu chéo ngày với bảng tính. – beoliver

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

Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với đầu ra. Xem python docs cho tài liệu chi tiết

+0

Cảm ơn. Tôi đã thử cái này, nhưng bị nhầm lẫn bởi việc thiếu định dạng ...Im đã từng làm việc với bash & awk, nơi in ra và sau đó sử dụng 'awk' {print $ n;} ''cho phép bạn vào các cột và' awk NR = $ variable' cho phép bạn chọn các dòng. Tôi nên xem phần nào? – beoliver

+0

@Gary chỉ ra một cách hay để làm điều đó cho Python2.7 +. Sử dụng nếu bạn có thể :) – Wesley

18

Với python2.7 bạn có thể sử dụng subprocess.check_output:

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

Trước python2.7, bạn cần phải sử dụng api mức độ thấp hơn, đó là tham gia nhiều hơn một chút.

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
ls_proc.wait() 
# check return code 
ls_lines = ls_proc.stdout.readlines() 
1

Đọc về Popen. bộ bạn yêu cầu bạn nhận được với

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

hoặc làm điều gì đó như

for x in proc.stdout : print x 

và tương tự cho stderr

bạn có thể kiểm tra trạng thái của quá trình này với

proc.poll() 

hoặc đợi để chấm dứt với

proc.wait() 

cũng đọc

read subprocess stdout line by line

4

Nếu những gì bạn thực sự muốn là liệt kê một thư mục, thay vì sử dụng os.listdir

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

tôi thực sự muốn liệt kê các bảng sân bay, nhưng nghĩ rằng tôi sẽ sử dụng một ví dụ đơn giản. Đầu ra thực tế sẽ là 'call (['/ System/Library/PrivateFrameworks/Apple80211.framework/Phiên bản/Current/Resources/airport', '-s'])' – beoliver

Các vấn đề liên quan