我对python缺乏经验,所以我发现自己不知道如何处理这个bug.我继承了一个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)
Run Code Online (Sandbox Code Playgroud)
该循环通常无法复制文件,除非我使用调试器单步执行或shutil.copyfile
在行后添加此语句.
print "copied ", concat_dirs(java_path, name), " to ", install_name
Run Code Online (Sandbox Code Playgroud)
如果我在调试中添加该语句或逐步执行,则循环可以完美且一致地工作.我很想对声明说"足够好",print
但我知道这只是掩盖了一个潜在的问题.
我不是要你调试我的代码,因为我知道你不能; 我要求调试策略.我该如何找到这个bug?
你确实有一个竞争条件:你检查 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)
Run Code Online (Sandbox Code Playgroud)
除了以非活泼的方式尝试并看看会发生什么之外,我不确定如何解决此问题。可能存在一个微妙的文件系统问题导致运行异常。
归档时间: |
|
查看次数: |
104 次 |
最近记录: |