2015-07-22 5 views
0

В моем коде на python скопируйте некоторый установщик на temp и установите его, а затем я хочу удалить временную копию. Я использую функцию «shutil.rmtree», чтобы удалить копию установщика в temp. Иногда я получаю сообщение об ошибке, как «[Ошибка 32] Процесс не может получить доступ к файлу, так как он используется другим процессом»Ошибка при выполнении shutil.rmtree

Как я могу избежать этого? У нас есть способ проверить, что каталог не используется какой-либо другой программой? Если да, то можем ли мы проверить наличие каталога, пока другой процесс не выйдет из управления и не удалит его?

Пожалуйста, помогите мне с образцами кодов! Я довольно новичок в python.

copy_dst = tempfile.mkdtemp() 

if success: 
    success = robocopy_file_or_folder(installer_location, copy_dst) 

local_path_to_setup = os.path.join(copy_dst, app_folder, 'setup.exe') 

if success: 
    success, response_text = install_product(local_path_to_setup, success, response_text) 
try: 
    if success: 
     shutil.rmtree(copy_dst, ignore_errors = False, onerror=handle_remove_readonly) 
except OSError as e: 
    log("  %s\n  Delete installer Local Copy at \"%s\" failed.\n" % (e, copy_dst)) 
    success = False 

Это код! и «install_product()» установит продукт, вызвав файл setup.exe в другой command.robocopy_file_or_folder() - скопирует файлы.

def handle_remove_readonly(func, path, exc): 
""" 
Changes the access mode of the specified folder to remove read_only 
""" 
exc_value = exc[1] 
if func in (os.rmdir, os.remove) and exc_value.errno == errno.EACCES: 
    os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 
    func(path) 
else: 
    raise 
+0

Скопируйте код, в котором вы написали –

+0

Как вы это понимаете? –

ответ

0

"install_product()" установит продукт, запустив setup.exe в другом command.robocopy_file_or_folder() - скопирует файлы.

Ждите окончания установки и setup.exe, чтобы выйти, прежде чем пытаться удалить каталог.

+0

Я использую start/wait cmd \ c для запуска setup.exe. Поэтому он должен ждать завершения установки –

+0

Он находится в функции install_product(). –