在 numpy.save 中写入 pickle 文件时出现 FileNotFoundError
FileNotFoundError when writing pickle file in numpy.save
我看到一个令人困惑的间歇性错误。有时当我打电话给 np.save
我得到 FileNotFoundError
.
Traceback (most recent call last):
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 536, in save
pickle_kwargs=pickle_kwargs)
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/format.py", line 629, in write_array
pickle.dump(array, fp, protocol=2, **pickle_kwargs)
FileNotFoundError: [Errno 2] No such file or directory
During handling of the above exception, another exception occurred:
File "/home/leo/dev/vizproc/embed.py", line 59, in save
np.save(filename, obj)
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 539, in save
fid.close()
FileNotFoundError: [Errno 2] No such file or directory
它正在写入的目录肯定存在,并且该对象是一个混合了 [str]
和 np.ndarray
的字典,所以它在输出时被腌制了。查看 numpy 源代码,它似乎正在尝试关闭它为写入而打开的文件,但未能成功:
own_fid = False
if hasattr(file, 'read'):
fid = file
else:
file = os_fspath(file)
if not file.endswith('.npy'):
file = file + '.npy'
fid = open(file, "wb")
own_fid = True
if sys.version_info[0] >= 3:
pickle_kwargs = dict(fix_imports=fix_imports)
else:
# Nothing to do on Python 2
pickle_kwargs = None
try:
arr = np.asanyarray(arr)
format.write_array(fid, arr, allow_pickle=allow_pickle,
pickle_kwargs=pickle_kwargs)
finally:
if own_fid:
fid.close() # <=- FileNotFoundError
并且在 format.write_array(...)
调用内部实际上只是一些类型检查,然后 pickle.dump(arr, fid, protocol=2, **pickle_kwargs)
也会引发 FileNotFoundError
.
我正在使用 Numpy:1.16.3,Python:3.7.1(默认,2018 年 12 月 14 日,19:28:38)[GCC 7.3.0] Ubuntu 18.04 .
我试图通过什么样的竞争条件可能导致这种情况,或者为什么会发生这种情况进行推理。是不是这个进程打开了文件,但是另一个进程在写入之前删除了文件?似乎是合理的,但这应该会重现失败,但事实并非如此:
fid = open("testfile", "wb")
os.unlink("testfile")
pickle.dump({'obj':'test'}, fid, protocol=2) # no error
fid.close() # no error
此外,出现错误后,磁盘上有一个零字节文件。知道发生了什么吗?
我相信这的根本原因是硬件问题或磁盘系统深处的问题。令人沮丧的是,OS 没有记录任何错误消息。一堆细节 in this github issue 包括一个更简单的重现案例,以防有人想深入研究。要点:它只发生在 USB 连接的磁盘上,并且只有路径中有符号链接时才发生。
我看到一个令人困惑的间歇性错误。有时当我打电话给 np.save
我得到 FileNotFoundError
.
Traceback (most recent call last):
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 536, in save
pickle_kwargs=pickle_kwargs)
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/format.py", line 629, in write_array
pickle.dump(array, fp, protocol=2, **pickle_kwargs)
FileNotFoundError: [Errno 2] No such file or directory
During handling of the above exception, another exception occurred:
File "/home/leo/dev/vizproc/embed.py", line 59, in save
np.save(filename, obj)
File "/home/leo/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py", line 539, in save
fid.close()
FileNotFoundError: [Errno 2] No such file or directory
它正在写入的目录肯定存在,并且该对象是一个混合了 [str]
和 np.ndarray
的字典,所以它在输出时被腌制了。查看 numpy 源代码,它似乎正在尝试关闭它为写入而打开的文件,但未能成功:
own_fid = False
if hasattr(file, 'read'):
fid = file
else:
file = os_fspath(file)
if not file.endswith('.npy'):
file = file + '.npy'
fid = open(file, "wb")
own_fid = True
if sys.version_info[0] >= 3:
pickle_kwargs = dict(fix_imports=fix_imports)
else:
# Nothing to do on Python 2
pickle_kwargs = None
try:
arr = np.asanyarray(arr)
format.write_array(fid, arr, allow_pickle=allow_pickle,
pickle_kwargs=pickle_kwargs)
finally:
if own_fid:
fid.close() # <=- FileNotFoundError
并且在 format.write_array(...)
调用内部实际上只是一些类型检查,然后 pickle.dump(arr, fid, protocol=2, **pickle_kwargs)
也会引发 FileNotFoundError
.
我正在使用 Numpy:1.16.3,Python:3.7.1(默认,2018 年 12 月 14 日,19:28:38)[GCC 7.3.0] Ubuntu 18.04 .
我试图通过什么样的竞争条件可能导致这种情况,或者为什么会发生这种情况进行推理。是不是这个进程打开了文件,但是另一个进程在写入之前删除了文件?似乎是合理的,但这应该会重现失败,但事实并非如此:
fid = open("testfile", "wb")
os.unlink("testfile")
pickle.dump({'obj':'test'}, fid, protocol=2) # no error
fid.close() # no error
此外,出现错误后,磁盘上有一个零字节文件。知道发生了什么吗?
我相信这的根本原因是硬件问题或磁盘系统深处的问题。令人沮丧的是,OS 没有记录任何错误消息。一堆细节 in this github issue 包括一个更简单的重现案例,以防有人想深入研究。要点:它只发生在 USB 连接的磁盘上,并且只有路径中有符号链接时才发生。