Người dùng UNIX đã quen thuộc với khái niệm đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và lỗi tiêu chuẩn. Phần này dành cho phần còn lại của bạn
Ví dụ 10. 8. Giới thiệu stdout và stderr
>>> for i in range[3]: .. print 'Dive in' Dive in Dive in Dive in >>> import sys >>> for i in range[3]: .. sys.stdout.write['Dive in'] Dive inDive inDive in >>> for i in range[3]: .. sys.stderr.write['Dive in'] Dive inDive inDive in
thiết bị xuất chuẩn là một đối tượng giống như tệp; . Trên thực tế, đây là những gì chức năng in thực sự làm; . tiêu chuẩn. viết
thiết bị xuất chuẩn và thiết bị xuất chuẩn đều là các đối tượng giống như tệp, giống như các đối tượng bạn đã thảo luận trong phần trước, nhưng cả hai đều chỉ ghi. Họ không có phương pháp đọc, chỉ viết. Tuy nhiên, chúng là các đối tượng giống như tệp và bạn có thể gán bất kỳ đối tượng giống tệp hoặc tệp nào khác cho chúng để chuyển hướng đầu ra của chúng
Ví dụ 10. 9. chuyển hướng đầu ra
[you@localhost kgp]$ python stdout.py Dive in [you@localhost kgp]$ cat out.log This message will be logged instead of displayed
[Trên Windows, bạn có thể sử dụng type thay vì cat để hiển thị nội dung của tệp. ]
Nếu bạn chưa làm như vậy, bạn có thể tải xuống ví dụ này và các ví dụ khác được sử dụng trong cuốn sách này
Điều này sẽ in ra IDE “Cửa sổ tương tác” [hoặc thiết bị đầu cuối, nếu chạy tập lệnh từ dòng lệnh]. Luôn lưu thiết bị xuất chuẩn trước khi chuyển hướng nó, để bạn có thể đặt nó trở lại bình thường sau. Mở tệp để ghi. Nếu tệp không tồn tại, nó sẽ được tạo. Nếu tập tin tồn tại, nó sẽ bị ghi đè. Chuyển hướng tất cả đầu ra tiếp theo sang tệp mới mà bạn vừa mở. Điều này sẽ chỉ được "in" vào tệp nhật ký; . Đặt thiết bị xuất chuẩn trở lại như trước khi bạn sử dụng nó. Đóng tệp nhật ký
Chuyển hướng stderr hoạt động chính xác theo cùng một cách, sử dụng sys. stderr thay vì sys. tiêu chuẩn
Ví dụ 10. 10. Thông tin lỗi chuyển hướng
[you@localhost kgp]$ python stderr.py [you@localhost kgp]$ cat error.log Traceback [most recent line last]: File "stderr.py", line 5, in ? raise Exception, 'this error will be logged' Exception: this error will be logged
Nếu bạn chưa làm như vậy, bạn có thể tải xuống ví dụ này và các ví dụ khác được sử dụng trong cuốn sách này
Mở tệp nhật ký mà bạn muốn lưu trữ thông tin gỡ lỗi. Chuyển hướng lỗi tiêu chuẩn bằng cách gán đối tượng tệp của tệp nhật ký mới mở cho thiết bị lỗi chuẩn. Tăng một ngoại lệ. Lưu ý từ đầu ra màn hình rằng điều này không in bất cứ thứ gì trên màn hình. Tất cả các thông tin truy nguyên bình thường đã được ghi vào lỗi. đăng nhập
Vì việc viết thông báo lỗi thành lỗi tiêu chuẩn rất phổ biến, nên có một cú pháp tốc ký có thể được sử dụng thay vì chuyển hướng nó hoàn toàn.
Ví dụ 10. 11. In sang stderr
>>> print 'entering function' entering function >>> import sys >>> print >> sys.stderr, 'entering function' entering function
Cú pháp tốc ký này của câu lệnh in có thể được sử dụng để ghi vào bất kỳ tệp đang mở hoặc đối tượng giống tệp nào. Trong trường hợp này, bạn có thể chuyển hướng một câu lệnh in sang thiết bị lỗi chuẩn mà không ảnh hưởng đến các câu lệnh in tiếp theo
Mặt khác, đầu vào tiêu chuẩn là một đối tượng tệp chỉ đọc và nó đại diện cho dữ liệu chảy vào chương trình từ một số chương trình trước đó. Điều này có thể sẽ không có nhiều ý nghĩa đối với người dùng Mac OS cổ điển hoặc thậm chí cả người dùng Windows trừ khi bạn đã từng thông thạo dòng lệnh MS-DOS. Cách thức hoạt động của nó là bạn có thể xây dựng một chuỗi lệnh trong một dòng duy nhất để đầu ra của một chương trình trở thành đầu vào cho chương trình tiếp theo trong chuỗi. Chương trình đầu tiên chỉ xuất ra đầu ra tiêu chuẩn [không thực hiện bất kỳ chuyển hướng đặc biệt nào, chỉ thực hiện các câu lệnh in bình thường hoặc bất cứ điều gì], và chương trình tiếp theo đọc từ đầu vào tiêu chuẩn và hệ điều hành đảm nhiệm việc kết nối đầu ra của một chương trình với đầu vào của chương trình tiếp theo
Ví dụ 10. 12. Chuỗi lệnh
[you@localhost kgp]$ python kgp.py -g binary.xml 01100111 [you@localhost kgp]$ cat binary.xml0
1
\
[you@localhost kgp]$ cat binary.xml | python kgp.py -g - 10110001
Như bạn đã thấy trong phần , thao tác này sẽ in ra một chuỗi tám bit ngẫu nhiên, 0 hoặc 1. Điều này chỉ đơn giản là in ra toàn bộ nội dung của nhị phân. xml. [Người dùng Windows nên sử dụng type thay vì cat. ] Thay vì chỉ định một mô-đun [như nhị phân. xml], bạn chỉ định “-”, điều này khiến tập lệnh của bạn tải ngữ pháp từ đầu vào tiêu chuẩn thay vì từ một tệp cụ thể trên đĩa. [Thông tin thêm về cách điều này xảy ra trong ví dụ tiếp theo. ] Vì vậy, hiệu ứng giống như cú pháp đầu tiên, trong đó bạn đã chỉ định trực tiếp tên tệp ngữ pháp, nhưng hãy nghĩ đến các khả năng mở rộng ở đây. Thay vì chỉ đơn giản là làm mèo nhị phân. xml, bạn có thể chạy tập lệnh tự động tạo ngữ pháp, sau đó bạn có thể đưa tập lệnh đó vào tập lệnh của mình. Nó có thể đến từ bất cứ đâu. cơ sở dữ liệu hoặc một số tập lệnh meta tạo ngữ pháp hoặc bất kỳ thứ gì. Vấn đề là bạn không cần phải thay đổi kgp của mình. py để kết hợp bất kỳ chức năng nào trong số này. Tất cả những gì bạn cần làm là có thể lấy các tệp ngữ pháp từ đầu vào tiêu chuẩn và bạn có thể tách tất cả logic khác thành một chương trình khác
Vậy làm cách nào để tập lệnh “biết” đọc từ đầu vào tiêu chuẩn khi tệp ngữ pháp là “-”?
Ví dụ 10. 13. Đọc từ đầu vào tiêu chuẩn tính bằng kgp. py
Đây là chức năng openAnything từ hộp công cụ. py, mà bạn đã kiểm tra trước đây trong. Tất cả những gì bạn đã làm là thêm ba dòng mã vào đầu hàm để kiểm tra xem nguồn có phải là “-”; . tiêu chuẩn. Thực sự, đó là nó. Hãy nhớ rằng, stdin là một đối tượng giống như tệp có phương thức đọc, vì vậy phần còn lại của mã [tính bằng kgp. py, nơi bạn gọi openAnything] không thay đổi chút nào