FileNotFoundError при записи файла pickle в numpy.save - PullRequest
0 голосов
/ 19 сентября 2019

Я вижу сбивающую с толку прерывистую ошибку.Иногда, когда я звоню 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

Кроме того, после возникновения ошибки на диске появляется файл нулевого байта.Есть идеи, что происходит?

...