2011-11-21 67 views
16

Tôi muốn chạy một chương trình dòng lệnh từ bên trong một tập lệnh python và nhận được kết quả đầu ra.Cách lấy dữ liệu từ dòng lệnh từ bên trong chương trình Python?

Làm cách nào để nhận thông tin được hiển thị bởi foo để tôi có thể sử dụng thông tin đó trong tập lệnh của mình?

Ví dụ, tôi gọi foo file1 từ dòng lệnh và nó in ra

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

Làm thế nào tôi có thể lấy tên file làm một cái gì đó giống như filename = os.system('foo file1')?

+1

có thể trùng lặp của [Thực thi chương trình dòng lệnh từ trong python] (http://stackoverflow.com/questions/450285/executing-command-line-programs-from-within-python) – Daenyth

Trả lời

18

Sử dụng các mô-đun subprocess:

import subprocess 

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

Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với biến text: biểu thức chính quy, tách vv

The 2nd và các thông số thứ 3 của subprocess.Popen là tùy chọn và có thể đã xóa.

+2

... trong đó 'lệnh' phải là '['foo', 'file1', 'file2', ...]'. +1. –

+0

Cảm ơn! Vì vậy, đầu ra foo là tất cả trong văn bản ... Bây giờ làm thế nào tôi sẽ nhận được tên tập tin ra khỏi đó? Nó giống như một mảng hay cái gì đó mà tôi có thể nhận được văn bản [1]? Hoặc tôi có thể tìm kiếm qua "Tên:" không? Hoặc bắt đầu tại dòng # 2 ký tự # 7 qua dòng mới? – user1058492

+1

Nhìn vào mô-đun tái và viết một biểu thức chính quy đơn giản kéo nó vào '' pat = re.compile (r'Name: \ s + (. *) $ ') M = pat.search (văn bản) nếu m: m. nhóm (1) '' (bạn sẽ cần phải thêm một số dòng mới) – koblas

4

Cách dễ nhất để có được đầu ra của một công cụ được gọi thông qua tập lệnh Python của bạn là sử dụng mô-đun subprocess trong thư viện chuẩn. Hãy xem subprocess.check_output.

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

(Nếu công cụ của bạn được nhập từ các nguồn không tin cậy, đảm bảo không dùng tham số shell=True.)

2

này thường là một chủ đề cho một kịch bản bash mà bạn có thể chạy trong 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 

chỉnh sửa: Làm thế nào để sử dụng nó: mở một pseuso-thiết bị đầu cuối, sau đó sao chép-dán này:

cd 
wget http://pastie.org/pastes/2900209/download -O info-files.bash 

Trong 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 
+1

Tôi không biết gì về bash. Làm thế nào để sử dụng nó với Python? – user1058492

+0

Xem bài chỉnh sửa của tôi trong bài đăng của tôi;) –

+0

Giải pháp này chỉ dành cho Linux hoặc Windows nếu bạn có Cygwin http://en.wikipedia.org/wiki/Cygwin Nếu bạn đang sử dụng cửa sổ hoặc nếu bạn muốn một giải pháp di động, xem bài đăng mới của tôi –

1

Đây là một giải pháp di động trong python tinh khiết:

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

Trong Python, Bạn có thể vượt qua một lệnh hệ điều hành đơn giản với không gian, subquotes và dòng mới vào subcommand để chúng tôi có thể phân tích cú pháp văn bản phản hồi như sau:

  1. Lưu mã này vào 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; 
    
  2. Sau đó chạy nó như thế này:

    python test.py 
    
  3. nào in:

    this echo command has subquotes, spaces, 
    
    
    and newlines! 
    

Nếu điều này không làm việc cho bạn, nó có thể là khó khăn với trăn phiên bản hoặc hệ điều hành. Tôi đang sử dụng Python 2.7.3 trên Ubuntu 12.10 cho ví dụ này.

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