当条件为false时,为什么if语句中的代码会运行?

2024-10-03 21:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个if语句,检查目录是否已经存在:

if not os.path.exists(os.path.dirname(save_to)):
     os.makedirs(os.path.dirname(save_to))

在此之后,文件被添加到目录save_to,不管它以前是否存在

有时,即使目录已经存在,也会执行if语句中的代码。这完全是随机的

我相信这是因为我正在使用multiprocessing.Pool.map将此任务分配给多个CPU。我认为进程1和进程2进入了if语句。我认为进程1然后创建目录,然后进程2尝试并失败

这就是我得到的错误:

multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File "/home/WNeill/anaconda3/lib/python3.8/multiprocessing/pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "/home/WNeill/anaconda3/lib/python3.8/multiprocessing/pool.py", line 51, in starmapstar
    return list(itertools.starmap(args[0], args[1]))
  File "/home/WNeill/who-said-what/wsw/preprocessing.py", line 147, in clip_audio ****!!!****
    os.makedirs(os.path.dirname(save_to))                                         ****!!!****
  File "/home/WNeill/anaconda3/lib/python3.8/os.py", line 223, in makedirs
    mkdir(name, mode)
FileExistsError: [Errno 17] File exists: '/home/WNeill/clipped/clipped/aldfly'

我想不出执行第147行的任何其他原因,该行对应于上面的代码段(也在堆栈跟踪中标记)

问题:

我如何解决这个问题(不管我的假设是否正确)

建议的解决方案:

我唯一的想法是可能使用参数exist_ok=True并去掉if语句。但是,如果我使用这种方法,我担心会覆盖工作。我有大约8个小时的处理时间,我讨厌删除/覆盖某些内容


Tags: topathinpy目录homeif进程
1条回答
网友
1楼 · 发布于 2024-10-03 21:31:42

一个有点大的解决办法是参考这篇文章

您可以使用这里提到的ManagerLock在代码的该部分创建一个关键部分。换句话说,这将导致到达那里的第一个线程阻止其他线程执行该部分代码,只有在释放锁之后,它们才能继续它们的快乐之路

相关问题 更多 >