2009-07-30 30 views
8

Hôm nay tôi chạy chống lại thực tế, rằng sys.exit() được gọi là từ một chủ đề con không giết quá trình chính. Tôi không biết điều này trước đây, và điều này là ổn, nhưng tôi cần thời gian dài để nhận ra điều này. Nó có thể đã lưu nhiều thời gian, nếu sys.exit(msg) đã in msg đến stderr. Nhưng nó không.Python: Tại sao `sys.exit (msg)` được gọi từ một luồng không in `msg` thành stderr?

Hóa ra đó không phải là lỗi thực sự trong ứng dụng của tôi; nó được gọi là sys.exit(msg) với một lỗi có ý nghĩa theo một cách có ý nghĩa - nhưng tôi không thể thấy điều này.

In the docs for sys.exit() it is stated: "[...] bất kỳ đối tượng khác được in để sys.stderr và kết quả trong một mã lối ra của 1"

Đây là không đúng cho một cuộc gọi từ một đứa trẻ sợi, nơi sys.exit() rõ ràng là cư xử như thread.exit(): "Nâng cao ngoại trừ SystemExit Khi không bắt được, điều này sẽ gây ra các chủ đề để thoát âm thầm."

Tôi nghĩ khi một lập trình viên muốn sys.exit(msg) để in một thông báo lỗi, thì điều này chỉ nên được in - độc lập với nơi mà nó được gọi. Tại sao không? Tôi hiện không thấy lý do nào. Ít nhất phải có một gợi ý trong tài liệu cho sys.exit() rằng thư không được in từ chuỗi.

Bạn nghĩ sao? Tại sao các thông báo lỗi bị ẩn khỏi chủ đề? Điều này có nghĩa không?

Trân trọng,

Jan-Philip Gehrcke

Trả lời

6

Tôi đồng ý rằng tài liệu Python không chính xác hoặc có thể không chính xác hơn, liên quan đến sys.exit và SystemExit khi được gọi/nâng lên bởi các chủ đề khác với chủ đề chính; xin vui lòng mở một vấn đề doc trên trình theo dõi trực tuyến Python để điều này có thể được giải quyết trong một lần lặp lại trong tương lai của tài liệu (có thể là một bản sửa lỗi doc gần tương lai dễ dàng hơn và mượt mà hơn các bản sửa lỗi ;-).

Biện pháp khắc phục là khá dễ dàng, tất nhiên - chỉ cần quấn bất kỳ chức năng bạn đang sử dụng như là mục tiêu của một threading.Thread với một trang trí mà không một try/except SystemExit, e: xung quanh nó, và thực hiện các "viết thư cho thiết bị lỗi chuẩn" chức năng phụ bạn yêu cầu (hoặc, có thể tốt hơn, sử dụng một cuộc gọi logging.error thay vì) trước khi chấm dứt. Nhưng, với vấn đề tài liệu mà bạn chỉ ra chính xác, thật khó để suy nghĩ về việc đó trừ khi và cho đến khi một người gặp vấn đề và thực tế đã phải mất một chút thời gian để gỡ lỗi, làm (thay mặt tập thể của các nhà phát triển python cốt lõi - xin lỗi!).

+0

Bạn đã cho tôi lời khuyên tốt, một lần nữa;) Btw: Thật tuyệt vời khi bạn chia sẻ kiến ​​thức của mình tại đây. Tôi thấy rằng bạn hiện đang dành phần lớn thời gian của mình để lấp đầy nền tảng này với các công cụ thuần túy về Python!Đây là những gì cộng đồng cần nhưng đó không phải là vấn đề tất nhiên. Một cảm ơn rất lớn về điều này! Jan-Philip –

+0

@ Jan-Philip, bạn được chào đón nhiều nhất, và, cảm ơn BẠN vì các kudo, nó luôn tuyệt vời khi biết tôi đang được giúp đỡ! –

0

Không phải tất cả chủ đề trong python đều bình đẳng. Gọi sys.exit từ một chủ đề, không thực sự thoát khỏi hệ thống. Vì vậy, gọi sys.exit() từ một chuỗi con là vô nghĩa, do đó, nó có ý nghĩa rằng nó không hành xử theo cách bạn mong đợi.

Điều này page nói nhiều hơn về các đối tượng luồng và sự khác biệt giữa chủ đề và chuỗi "chính" đặc biệt.

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