gpt4 book ai didi

python - 奇怪的竞争条件 : FileNotFoundError with mkdtemp

转载 作者:行者123 更新时间:2023-12-01 05:19:42 27 4
gpt4 key购买 nike

我在使用 Python 的 Mac OS X 中遇到了相当奇怪的竞争条件(我只测试过 Python 3.3)。我正在创建几个临时目录,向其中写入内容,然后清除它们。类似于

while running:
(do something)
tempdir = mkdtemp('name')
try:
(write some stuff to tempdir)
finally:
shutil.rmtree(tempdir)

但是,在 的一些后续循环中(向 tempdir 写入一些内容),我收到如下错误

    with open(os.path.join("/var/folders/yc/8wpl9rlx47qgzxqpcf003k280000gn/T/tmp0fh2ztname", "file"), 'w', encoding='utf-8') as fn:
FileNotFoundError: [Errno 2] No such file or directory: '/var/folders/yc/8wpl9rlx47qgzxqpcf003k280000gn/T/tmpups5dpname/file'

(为了清楚起见,我内联了临时目录路径)

请注意,正在打开的路径与它找不到的路径不同。在每种情况下,错误消息中的路径都是来自上一次循环迭代的临时目录。

大多数情况下,该错误都可以在同一位置重现(大约在第四次迭代之后),但并非每次都会重现。

编辑:我刚刚意识到这可能是相关的。 (向 tempdir 写入一些内容) 内容实际上发生在子进程中。这就是我如何确定 tempdir 路径,我必须将其传递给子进程(我实际上在“清晰度”位上撒了谎,我实际上正在用精确的 with open 写出一个 Python 文件> 线)。这就是我如何确定 tempdir 路径确实与正在使用的路径不同的原因。

最佳答案

我明白了。事实证明它与 mkdtemp 无关(Mac OS X 和 Python 在那里做了正确的事情,这让我松了一口气)。

问题是我将代码写入文件,包括 with open(os.path.join("/var/folders/yc/8wpl9rlx47qgzxqpcf003k280000gn/T/tmp0fh2ztname", "file") ,'w',encoding='utf-8')作为fn:位,并在子进程中运行它。问题是我每次都使用相同文件,并且 .pyc 文件没有正确失效。

错误消息令人困惑,因为当 Python 生成回溯时,它会读取 .py 文件(实际代码所在的位置),但实际运行的是 .pyc 文件。

如果我明白的话http://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html正确的是,.pyc 文件中的时间戳只有一秒的粒度(这解释了为什么每次都可以在同一位置重现:循环中相同的第四项运行时间不到一秒)。

解决方案是在写出文件时显式删除 .pyc 文件(在其他情况下,您也可以写出到临时文件本身,但在我的情况下,我需要该文件可以以相同的名称导入)。

类似的东西

if sys.version_info >= (3,):
os.unlink(os.path.join(path_to_file, '__pycache__', 'file.cpython-%s%s.pyc' % sys.version_info[:2]))
os.unlink(os.path.join(path_to_file, '__pycache__', 'file.cpython-%s%s.pyo' % sys.version_info[:2]))
else:
os.unlink(os.path.join(path_to_file, 'file.pyc'))
os.unlink(os.path.join(path_to_file, 'file.pyo'))

关于python - 奇怪的竞争条件 : FileNotFoundError with mkdtemp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639172/

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