2011-12-12 13 views
13

Đây có lẽ là một cái gì đó thực sự cơ bản, nhưng tôi không thể tìm thấy một giải pháp tốt cho nó. tôi cần phải viết một kịch bản python mà có thể nhận tín hiệu vào từ một đường ống như thế này:Cách chuyển hướng đầu ra của lệnh shell vào đầu vào tập lệnh Python?

$ some-linux-command | my_script.py 

một cái gì đó như thế này:

cat email.txt | script.py 

Hoặc nó sẽ chỉ được đường ống bởi tập tin .forward tôi trực tiếp từ sendmail . Điều này có nghĩa là tệp đầu vào có thể là một cái gì đó tương đối lớn nếu nó có tệp đính kèm, và nó có thể là một e-mail, sau này tôi sẽ phải đưa vào cơ sở dữ liệu người gửi, chủ đề và như vậy, nhưng tôi đã viết các kịch bản cơ sở dữ liệu trong python, do đó, một phần sẽ được OK. Vấn đề chính là làm thế nào để nắm bắt dữ liệu chảy vào từ ống.

+0

tại sao bạn được gắn cố định trên đường ống, bạn không thể viết kết quả đó vào tệp và thực hiện các thao tác trên đó, sau này? –

+5

@SrinivasReddyThatiparthy: ống là bản chất của Unix, nhận xét của bạn không hợp lệ. – Stan

Trả lời

3

đọc từ sys.stdin, mà là một tập tin như đối tượng

21

Sử dụng sys.stdin để đọc các đầu vào. Ví dụ:

nội dung Ví dụ về s.py:

import sys 
data = sys.stdin.readlines() 
print data 

- Chạy:

[email protected]:~$ cat t.txt 
    alpha 
    beta 
    gamma 

    [email protected]:~$ cat t.txt | python ./s.py 
    ['alpha\n', 'beta\n', 'gamma\n'] 

Bạn cũng có thể làm cho kịch bản python như shell script sử dụng công việc này:

#!/usr/bin/env python 

và thay đổi quyền 'a + x'

[email protected]:~$ cat t.txt | ./s.py 
['alpha\n', 'beta\n', 'gamma\n'] 
+0

Cảm ơn, nó hoạt động, và may mắn tôi có thể nhập sys trên hộp đó, (nó là solaris 10, nó có vấn đề nhập khẩu các mô-đun khác, đối với một số mô-đun nó ném một "ImportError: ld.so.1:/usr/local/bin/python: fatal: lỗi di chuyển: file /usr/local/lib/python2.6/lib-dynload/_socket.so: symbol inet_aton: biểu tượng tham chiếu không tìm thấy "bởi vì nó là inet_pton trên solaris.) – delta

+8

bạn có thể chấp nhận nó như câu trả lời đúng nếu nó hoạt động. – DhruvPathak