Tôi đã kế thừa một số mã định kỳ (ngẫu nhiên) không thành công do lỗi đầu vào/đầu ra được đưa ra trong khi gọi để in. Tôi đang cố gắng xác định nguyên nhân của ngoại lệ được nêu ra (hoặc ít nhất, hiểu rõ hơn về nó) và cách xử lý nó một cách chính xác.Lỗi đầu vào/đầu ra IOError khi in
Khi thực hiện dòng sau của Python (trong một phiên dịch 2.6.6, chạy trên CentOS 5.5):
print >> sys.stderr, 'Unable to do something: %s' % command
Trường hợp ngoại lệ được nâng lên (traceback bỏ qua):
IOError: [Errno 5] Input/output error
Đối với bối cảnh , đây thường là chức năng lớn hơn đang cố gắng thực hiện tại thời điểm đó:
from subprocess import Popen, PIPE
import sys
def run_commands(commands):
for command in commands:
try:
out, err = Popen(command, shell=True, stdout=PIPE, stderr=PIPE).communicate()
print >> sys.stdout, out
if err:
raise Exception('ERROR -- an error occurred when executing this command: %s --- err: %s' % (command, err))
except:
print >> sys.stderr, 'Unable to do something: %s' % command
run_commands(["ls", "echo foo"])
>>
cú pháp không phải là đặc biệt quen thuộc với tôi, nó không phải cái gì tôi sử dụng thường xuyên, và tôi hiểu rằng nó có lẽ là least preferred way của văn bản để stderr. Tuy nhiên tôi không tin rằng các giải pháp thay thế sẽ khắc phục được vấn đề cơ bản.
Từ tài liệu tôi đã đọc, IOError 5 thường bị lạm dụng và được định nghĩa một cách lỏng lẻo, với các hệ điều hành khác nhau sử dụng nó để giải quyết các vấn đề khác nhau. Điều tốt nhất tôi có thể thấy trong trường hợp của tôi là quá trình python không còn được gắn với terminal/pty nữa.
Tốt nhất tôi không thể nói không có gì đang ngắt kết nối quy trình khỏi luồng stdout/stderr - thiết bị đầu cuối vẫn mở ví dụ và mọi thứ 'xuất hiện' sẽ ổn. Nó có thể được gây ra bởi quá trình con chấm dứt trong một thời trang ô uế? Điều gì khác có thể là nguyên nhân của vấn đề này - hoặc tôi có thể giới thiệu các bước nào khác để gỡ lỗi thêm?
Về mặt xử lý ngoại lệ, tôi rõ ràng có thể bắt được nó, nhưng tôi giả định điều này có nghĩa là tôi sẽ không thể in ra stdout/stderr cho phần còn lại của việc thực thi? Tôi có thể gắn lại các luồng này bằng cách nào đó - có lẽ bằng cách đặt lại sys.stdout
thành sys.__stdout__
v.v. Trong trường hợp này không thể ghi vào stdout/stderr không được coi là gây tử vong nhưng nếu nó là một dấu hiệu của một cái gì đó bắt đầu đi sai tôi muốn bảo lãnh sớm.
Tôi đoán cuối cùng tôi đang ở một chút mất mát về vị trí bắt đầu gỡ lỗi này ...
Tôi chỉ có thể thấy một vài người đã xem câu hỏi này, không có nhận xét/câu trả lời. Nếu câu hỏi có cấu trúc kém/không rõ ràng, hãy giúp tôi cải thiện nó để tôi có thể hướng tới câu trả lời. –
Tôi cũng đang xử lý lỗi này. Vì vậy, gây phiền nhiễu để có được lỗi này đôi khi. –
Đừng cảm thấy xấu về vài câu trả lời; câu hỏi và định dạng của bạn thật tuyệt vời; đây chỉ đơn giản là một câu hỏi khó trả lời. – culix