我正在将一个程序从Python2(不知道使用的确切版本)移植到Python3.3并更新一些东西,但是这个循环检查一组最近访问的文件路径是否存在于实际文件中崩溃。
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已停止响应”错误时崩溃。
但最奇怪的部分必须是,当我在os.path.exists
之前添加一个打印语句时,它会定期运行:
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
这是怎么回事?我假设它与循环的速度与文件访问时间或某些东西有某种关系,因为慢慢地步进允许它执行正常,但老实说我不知道问题是什么。
答案 0 :(得分:1)
很多细节都很难说,但是这里有一个理论:当你添加print
时,这实际上会引发一个IOError(这是可能的,如documented),它被捕获,并且os.path.exists(story.recentFiles.GetHistoryFile(index))
未执行,因此您的程序不会挂起。
您可以使用以下测试(在您引用的代码之前)对此进行测试:
try:
print('test')
except IOError:
with open('ioerror_raised.txt', 'w'):
pass
如果ioerror_raised.txt
提出print
,则会创建文件IOError
。
这可以解释为什么添加print
会使代码运行。
(如果是这种情况,那么显然应该调试os.path.exists(story.recentFiles.GetHistoryFile(index))
。)
答案 1 :(得分:1)
您可以在循环开头创建一个有效索引的静态列表(带range()),但是您要从循环中的列表(RemoveRecentFile)中删除文件。
所以你的问题可能是,你用10个文件开始循环,删除了一个文件(例如索引4),因为你无法访问它,然后尝试访问文件第10个文件(索引9)因为你已经移动了5-> 4,6-> 5,7-> 6,8-> 7,9->
答案 2 :(得分:0)
您正在与一些写得不好的C / C#/ C ++代码连接,因此很难确定错误的位置。
从API使您通过调用检索列表项而不是仅仅使用索引的方式来看,写得很糟糕。
祝你好运!
答案 3 :(得分:0)
我不确定您是否手动移植代码,但您可以随时尝试自动化工具: http://docs.python.org/2/library/2to3.html