2012-11-18 21 views
21

Trong một kịch bản Python đơn giản có ý định chạy từ trình bao, tôi có thể xác định một cách đáng tin cậy rằng sys.stdin đã được chuyển hướng từ một tệp thực tế so với đường dẫn từ một tiến trình khác không?Làm cách nào để xác định xem sys.stdin có được chuyển hướng từ tệp so với đường dẫn từ quá trình khác không?

Tôi muốn thay đổi hành vi thời gian chạy tùy thuộc vào việc stdin có đến từ tệp dữ liệu hay không từ luồng khác từ quá trình khác qua đường ống.

Như mong đợi, isatty() trả về Sai trong cả hai trường hợp. Dưới đây là một cách nhanh chóng isatty() kiểm tra:

# test.py 
import os 
import sys 
print sys.stdin.isatty() 
print os.isatty(sys.stdin.fileno()) 

Thử nghiệm:

python test.py < file.txt 

sản xuất:

False 
False 

và:

ls -al | python test.py 

sản xuất:

False 
False 

Có phương pháp pythonic để thực hiện việc này không?

UNIX/Linux cụ thể là tốt, mặc dù nó sẽ được tốt đẹp để biết nếu nó có thể làm điều này một cách di động.

Chỉnh sửa: Lưu ý để trả lời người nhận xét: Tại sao tôi quan tâm? Vâng, trong trường hợp của tôi, tôi muốn đối phó với dữ liệu được đóng dấu thời gian xuất hiện trong khoảng thời gian bất thường khi được chuyển từ một quy trình khác; khi tôi phát lại dữ liệu đã được ghi trước từ một tệp, tôi muốn phát lại dữ liệu đó bằng cách sử dụng độ trễ cố định hoặc biến.

Tôi đồng ý có thể sử dụng phương pháp gọn gàng hơn (và tôi có thể nghĩ đến một số, bao gồm tập lệnh trung gian để chèn độ trễ trong luồng phát lại) nhưng tôi là tò mò về cuối kỳ.

+0

Tại sao bạn quan tâm? Không phải là toàn bộ vấn đề mà cả hai không thể phân biệt được? Điều gì về 'ls -al> file.txt && python test.py Eric

+0

Tôi muốn tái tạo thời gian giữa hai môi trường. Trong trường hợp tức thì, tôi chấp nhận các dòng (bản ghi) của dữ liệu dấu thời gian trong test.py và muốn xử lý dữ liệu từ tệp có độ trễ tương tự như khi tôi lần đầu tiên thu thập dữ liệu. – Inactivist

+2

Tiếp tục nhận xét của @Eric, sẽ không tốt hơn nếu bạn viết kịch bản của mình bằng hai khả năng: đọc từ stdin hoặc từ một tệp được đưa ra làm đối số? –

Trả lời

24

Bạn đang tìm kiếm stat macro:

import os, stat 

mode = os.fstat(0).st_mode 
if stat.S_ISFIFO(mode): 
    print "stdin is piped" 
elif stat.S_ISREG(mode): 
    print "stdin is redirected" 
else: 
    print "stdin is terminal" 
+0

Tuyệt vời! Tôi đã thử nghiệm điều này và xác minh rằng nó hoạt động như quảng cáo trên Linux và Windows. – Inactivist

+0

Bạn đã kiểm tra bản sao trước khi trả lời chưa? –

+1

@PiotrDobrogost: Tôi đã gặp khó khăn trong việc tìm kiếm các cụm từ tìm kiếm phù hợp cho cụm từ này. Nếu bạn tìm thấy một bản sao chính xác, vui lòng đăng liên kết và bỏ một bài viết. – georg

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