10

我正在将一个程序从 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 已停止响应”错误而崩溃。

不过,最奇怪的部分是,当我在 之前添加一个 print 语句时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

那是怎么回事?我假设它与循环速度与文件访问时间或其他东西有某种关系,因为慢慢地逐步执行允许它执行良好,但老实说我不知道​​问题是什么。

4

4 回答 4

1

您在循环开始时创建了一个有效索引的静态列表(使用 range()),但您正在从循环内的列表 (RemoveRecentFile) 中删除文件。

因此,您的问题可能是,您以 10 个文件开始循环,删除了一个文件(例如索引 4),因为您无法访问它,然后尝试访问第 10 个文件(索引 9),该文件不再存在,因为你已经移动了 5->4, 6->5, 7->6, 8->7, 9->8

于 2013-08-02T11:07:32.097 回答
1

很难说更多细节,但这里有一个理论:当您添加 时print,这实际上引发了一个 IOError (这是可能的,如文档所述),它被捕获,并且os.path.exists(story.recentFiles.GetHistoryFile(index))执行,因此您的程序不会挂起。

您可以使用以下测试(在您引用的代码之前)进行测试:

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

ioerror_raised.txt如果print提出IOError. _

这可以解释为什么添加 aprint会使代码运行。

(如果是这种情况,那么os.path.exists(story.recentFiles.GetHistoryFile(index))显然应该调试。)

于 2013-07-10T14:22:54.090 回答
0

我不确定您是否手动移植代码,但您总是可以尝试使用自动化工具: http ://docs.python.org/2/library/2to3.html

于 2013-08-13T19:54:27.093 回答
0

您正在与一些编写不佳的 C/C#/C++ 代码交互,因此很难确定错误所在。

从 API 让您通过调用而不是仅使用索引来检索列表项的方式可以明显看出它写得不好。

祝你好运!

于 2013-07-08T07:23:44.643 回答