2013-07-06 28 views
10

Tôi đang chuyển một chương trình từ Python2 (không biết phiên bản chính xác được sử dụng) sang Python3.3 và cập nhật một vài thứ, nhưng vòng lặp này kiểm tra sự tồn tại của một tập hợp các đường dẫn tệp được truy cập gần đây đối với các tệp thực sự bị treo.Kiểm tra sự tồn tại của tập tin Python - trừ khi tôi thêm lệnh in

for index in range(story.recentFiles.GetCount()): 
    try: 
     if not os.path.exists(story.recentFiles.GetHistoryFile(index)): pass 
    except IOError: 
     self.RemoveRecentFile(story, index) 
     break 

Truy cập vào một tệp duy nhất hoạt động tốt, do đó, đó là điều cần làm với vòng lặp. Nếu tôi bước qua vòng lặp với một trình gỡ lỗi, mã hoạt động tốt, nhưng nếu tôi chỉ chạy ứng dụng, nó treo trên một lỗi "python.exe đã ngừng đáp ứng".

Phần kỳ lạ nhất, tuy nhiên, đã có được điều đó khi tôi thêm một tuyên bố in trước os.path.exists, nó hoạt động trên một sự nhìn qua thường xuyên:

for index in range(story.recentFiles.GetCount()): 
    try: 
     print('test') # Why does printing this make it not crash?? 
     if not os.path.exists(story.recentFiles.GetHistoryFile(index)): pass 
    except IOError: 
     self.RemoveRecentFile(story, index) 
     break 

là gì với điều đó? Tôi giả sử nó có một số loại mối quan hệ với tốc độ của vòng lặp so với thời gian truy cập tập tin hoặc một cái gì đó kể từ khi bước qua từ từ cho phép nó thực hiện tốt, nhưng tôi thành thật không có ý tưởng vấn đề là gì.

+0

Có thể lỗi với Python 3 :)? – Bharat

+5

Nó có thể là một lỗi. Một giả định không chắc chắn là, nếu chương trình không làm bất cứ điều gì, Windows nghĩ rằng nó không đáp ứng. Nhưng, nếu bạn in một cái gì đó, MS biết ứng dụng đang hoạt động. Điều đó đã xảy ra với tôi một lần trong VB.NET. – refi64

+3

Các tệp đang truy cập là gì?Họ có tồn tại không? Các cuộc gọi đó thành 'câu chuyện' làm gì? Bạn có thể cho một ví dụ hoàn chỉnh, có thể chạy lại được không? – BrenBarn

Trả lời

0

Bạn đang giao tiếp với một số mã C/C#/C++ kém được viết nên khó có thể xác định được lỗi ở đâu.

Điều đó được viết kém rõ ràng từ cách API khiến bạn truy xuất danh sách các mục bằng cuộc gọi, thay vì chỉ sử dụng chỉ mục.

Chúc may mắn!

1

Thật khó có thể nói nhiều với nhiều chi tiết, nhưng đây là một lý thuyết: khi bạn thêm print, điều này thực sự đặt ra một IOError (điều này là có thể, như documented), được bắt, và os.path.exists(story.recentFiles.GetHistoryFile(index))không thực hiện , vì vậy chương trình của bạn không bị treo.

Bạn có thể kiểm tra điều này với một bài kiểm tra như sau (trước khi mã bạn trích dẫn):

try: 
    print('test') 
except IOError: 
    with open('ioerror_raised.txt', 'w'): 
     pass 

mà sẽ tạo ra một tập tin ioerror_raised.txt nếu print nâng IOError.

Điều này có thể giải thích tại sao thêm print làm cho mã chạy.

(Nếu đây là trường hợp, sau đó os.path.exists(story.recentFiles.GetHistoryFile(index)) nên rõ ràng được sửa lỗi.)

1

Bạn tạo một danh sách tĩnh của chỉ số hợp lệ (với phạm vi()) vào đầu vòng lặp, nhưng bạn đang loại bỏ các file từ danh sách (RemoveRecentFile) trong vòng lặp. Vì vậy, vấn đề của bạn có thể là bạn bắt đầu vòng lặp với 10 tệp, đã xóa một tệp (ví dụ: chỉ mục 4) vì bạn không thể truy cập tệp và sau đó thử truy cập tệp thứ 10 (chỉ mục 9) không còn ở đó nữa vì bạn đã chuyển 5-> 4, 6-> 5, 7-> 6, 8-> 7, 9-> 8

+0

đồng ý, tôi nghĩ rằng nó tương tự như sủi bọt trong tối ưu hóa trình biên dịch, trong đó trình biên dịch thêm vào để cho phép ống lót như vậy thông tin có thể được đường ống chính xác đến các giai đoạn khác nhau của các nhiệm vụ khác nhau. – Mai

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