Обработка исключений перемещения модуля Python shutil - PullRequest
0 голосов
/ 16 октября 2019

Путь к месту назначения / tmp / abc в обоих процессах 1 и процессах 2 Предположим, что N процессов запущено, нам нужно сохранить файл, сгенерированный последним

Process1

import shutil
shutil.move(src_path, destination_path)

Процесс 2

import os
os.remove(destination_path)

Решение 1. Обработайте процесс, сказав, что при сбое копирования [ErrNo2] нет такого файла или каталога

Это правильное решение? Есть ли лучший способ справиться с этим

Полезная ссылка Безопасная, атомарная операция копирования файлов

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Вы можете использовать FileNotFoundError ошибка

try : 
    shutil.move(src_path, destination_path)
except FileNotFoundError: 
    print ('File Not Found') 
    # Add whatever logic you want to execute
except : 
    print ('Some Other error')
0 голосов
/ 25 октября 2019

Основные решения, которые приходят на ум: либо

  • Храните частичную информацию для каждого процесса staging file
  • Положитесь на the os для атомных moves

или

  • Хранить частичную информацию для каждого процесса memory
  • Положиться на interprocess communication / locks для атомных writes

Для первого, например:

import tempfile
import os

FINAL = '/tmp/something'

def do_stuff():
    fd, name = tempfile.mkstemp(suffix="-%s" % os.getpid())
    while keep_doing_stuff():
        os.write(fd, get_output())
    os.close(fd)
    os.rename(name, FINAL)

if __name__ == '__main__':
    do_stuff()

Вы можете выбрать запуск по отдельности из оболочки (как показано выше) или с некоторыми оболочками процесса (подпроцесс или многопроцессорность подойдут), и в любом случае будет работать.

Для межпроцессного процесса вы, вероятно, захотите порождать все из родительского процесса

from multiprocessing import Process, Lock
from cStringIO import StringIO

def do_stuff(lock):
    output = StringIO()
    while keep_doing_stuff():
        output.write(get_output())
    with lock:
        with open(FINAL, 'w') as f:
            f.write(output.getvalue())
    output.close()

if __name__ == '__main__':
    lock = Lock()
    for num in range(2):
        Process(target=do_stuff, args=(lock,)).start()
...