Я вижу сбивающую с толку прерывистую ошибку.Иногда, когда я звоню 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
,так что это мариновано на выходе.Глядя на бесшабашный источник, кажется, что он пытается и не может закрыть файл, который открыл для записи:
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 (по умолчанию, 14 декабря 2018, 19:28:38) [GCC 7.3.0] в Ubuntu18.04.
Я пытаюсь выяснить, из-за какого рода расы это может быть вызвано или почему это может произойти.Это то, что файл открывается этим процессом, но затем другой процесс стирает файл, прежде чем происходит запись?Кажется разумным, но тогда это должно воспроизвести ошибку, чего не происходит:
fid = open("testfile", "wb")
os.unlink("testfile")
pickle.dump({'obj':'test'}, fid, protocol=2) # no error
fid.close() # no error
Кроме того, после возникновения ошибки на диске появляется файл нулевого байта.Есть идеи, что происходит?