2013-07-06 9 views
10

私はPython2.3からPython3.3にプログラムを移植していますが、いくつかのものを更新していますが、実際にファイルに対して最近アクセスされたファイルパスのセットが存在するとクラッシュします。Pythonファイルの存在チェックループがクラッシュする - print文を追加しない限り

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 

単一のファイルへのアクセスはうまく機能するため、ループと関係があります。デバッガでループをステップ実行すると、コードは正常に動作しますが、アプリケーションを実行するだけでは、 "python.exeが応答を停止しました"というエラーでクラッシュします。

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 

は何でアップしている:

奇妙な部分は、しかし、私はos.path.exists前にprint文を追加する場合、それは通常のrunthrough上で動作することに持っていますか?私はそれがループの速度対ファイルアクセス時間の何らかの関係を持っていると仮定しています。ゆっくりとステップ実行するとうまく実行できますが、問題は何か分かりません。

+0

おそらくPython 3のバグ:)? – Bharat

+5

これはバグかもしれません。プログラムが何もしなければ、Windowsはそれが応答していないと考えているというより一般的な仮定はありません。しかし、何かを印刷すると、MSはアプリケーションの動作を知っています。 VB.NETでそれが私に起こった。 – refi64

+3

アクセスしているファイルは何ですか?彼らは存在しますか? 「ストーリー」への呼びかけは何をするのでしょうか?実行可能な、実行可能な完全な例を与えることができますか? – BrenBarn

答えて

0

不適切な記述のC/C#/ C++コードとインターフェイスしているため、エラーのある箇所を特定するのは難しいです。

これは、インデックスを使用するのではなく、APIを使用して呼び出しによってリスト項目を取得する方法から明らかです。

Good Luck!

1

より詳細で多くを語るのは難しいですが、ここでは理論である:あなたがprintを追加するときに、これは実際にキャッチされた例外IOErrorを(これはdocumentedとして、可能である)、上昇し、os.path.exists(story.recentFiles.GetHistoryFile(index))は、実行ないですあなたのプログラムはハングしません。

あなたは(あなたが引用コードの前に)、以下のようなテストでこれをテストすることができます。printIOErrorを上げた場合、ファイルioerror_raised.txtを作成します

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

これは、printを追加するとコードが実行される理由を説明します。ループの先頭に

(この場合は、その後、os.path.exists(story.recentFiles.GetHistoryFile(index))は明らかにデバッグする必要があります。)

1

あなたは(()の範囲で)有効なインデックスの静的リストを作成しますが、からファイルを削除しますループ内のリスト(RemoveRecentFile)

したがって、10ファイルでループを開始し、1つのファイル(インデックス4など)を削除すると、そのファイルにアクセスできないため、10番目のファイル(インデックス9)にアクセスしようとすると、 5> 4,6→5,7→6,8→7,9→8

+0

が同意すると、コンパイラの最適化では、パイプライニングを有効にするコンパイラの追加パスを使用して、異なる作業の異なるステージに情報を正しくパイプすることができます。 – Mai

関連する問題