gpt4 book ai didi

python - 受时间影响的错误(显然)的调试策略

转载 作者:太空狗 更新时间:2023-10-30 00:17:27 26 4
gpt4 key购买 nike

我对 python 相当缺乏经验,所以我发现自己不知道如何解决这个错误。我继承了一个 python 应用程序,它主要只是将文件和文件夹从一个地方复制到另一个地方。所有文件和文件夹都在本地机器上,用户拥有完全的管理员权限,因此这里没有网络或安全问题。

我发现很多文件无法从一个目录复制到另一个目录,除非我以某种方式降低代码速度。如果我只是运行该程序,它会失败,但如果我使用调试器单步执行或将 print 语句添加到复制循环,它就会成功。区别似乎是循环的时间或内存中的移动。

我以前在编译语言中见过这种错误,它通常表示竞争条件或内存损坏。但是,只有一个线程并且没有与其他进程交互,因此竞争条件似乎是不可能的。内存损坏仍有可能,但我不确定如何使用 python 调查这种可能性。

这是有问题的循环。如您所见,这很简单:

def concat_dirs(dir, subdir):
return dir + "/" + subdir

for name in fullnames:
install_name = concat_dirs(install_path, name)
dirname = os.path.dirname(install_name)
if not os.path.exists(dirname):
os.makedirs(dirname)
shutil.copyfile(concat_dirs(java_path, name), install_name)

该循环通常无法复制文件,除非我使用调试器单步执行它或在 shutil.copyfile 行之后添加此语句。

    print "copied ", concat_dirs(java_path, name), " to ", install_name

如果我在调试中添加该语句或单步调试,循环将完美且一致地运行。我很想用 print 语句说“足够好”,但我知道这只是掩盖了一个潜在的问题。

我不是要你调试我的代码,因为我知道你不能;我要求调试策略。我该如何找到这个错误?

最佳答案

确实有一个竞争条件:您检查 dirname 是否存在,然后尝试创建它。如果发生意外情况,那应该会导致程序崩溃,但是...

在 Python 中,我们说请求宽恕比许可更容易。继续并每次都创建该目录,如果它已经存在则道歉:

import errno
import os

for name in fullnames:
source_name = os.path.join(java_path, name)
dest_name = os.path.join(install_path, name)
dest_dir = os.path.dirname(dest_name)

try:
os.makedirs(dest_dir)
except OSError as exc:
if exc.errno != errno.EEXIST:
raise

shutil.copyfile(source_name, dest_name)

我不确定我该如何解决这个问题,除非以非竞争性的方式尝试它并看看会发生什么。可能存在一个微妙的文件系统问题,导致此运行异常。

关于python - 受时间影响的错误(显然)的调试策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23164755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com