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ỳ.
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
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
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ố? –