Python tempfile. Современный файл зависает в Windows, когда нет прав на запись - PullRequest
3 голосов
/ 11 марта 2019

Моя среда - Python 3.7.2, работающая на Windows 10. Я работаю над виджетом выбора каталога и ищу самый чистый и надежный способ проверить, позволяет ли выбранный путь к каталогу разрешать запись. 1001 *

Ранее я открывал именованный файл обычным методом open(), записывал в него несколько байтов, затем удалял его - помещая все это в блок try-except. Это было нормально, но рискует оставить нежелательный файл. Недавно я наткнулся на документацию для tempfile.TemporaryFile(), и это казалось более чистым способом получить тот же результат без риска оставить ненужные файлы в системе.

Проблема в том, что tempfile.TemporaryFile() зависает в моей системе, когда ему задан параметр dir, доступный только для чтения. Я погуглил и нашел эту очень старую ошибку , но она была написана для Python 2.4 и была исправлена ​​давно.

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

import os, tempfile

def normOpen(checkPath):
    try:
        with open(os.path.join(checkPath,'x.txt'),'wb') as tf:
            tf.write(b'ABC')
    except Exception as e:
        print('Write disabled for '+checkPath)
        print(str(e))
    else:
        print('Write enabled  for '+checkPath)

def tfOpen(checkPath):
    try:
        with tempfile.TemporaryFile(dir=checkPath) as tf:
            tf.write(b'ABC')
    except Exception as e:
        print('Write disabled for '+checkPath)
        print(str(e))
    else:
        print('Write enabled  for '+checkPath)

tryPath1 = 'C:\\JDM\\Dev_Python\\TMPV\\canwrite'  #Full control path
tryPath2 = 'C:\\JDM\\Dev_Python\\TMPV\\nowrite'   #Read-only path

print('First method - normal file-open')
normOpen(tryPath1)
normOpen(tryPath2)

print('Second method - TemporaryFile')
tfOpen(tryPath1)
tfOpen(tryPath2)

Когда я запускаю этот скрипт, он висит на последней строке и просто сидит там (диспетчер задач показывает, что Python потребляет около 10-15% ЦП).

Windows CMD

Кто-нибудь знает, в чем может быть проблема? В частности, это ошибка Python или что-то не так с моим использованием TemporaryFile?

В случае, если это поможет, ниже приведены конкретные привилегии, которые Windows показывает для каждой из этих папок:

Permissions

1 Ответ

2 голосов
/ 13 марта 2019

Более глубокое погружение, чем я изначально делал, вызвало ответ. Это действительно ошибка Python , о которой сообщалось некоторое время назад, но которая еще не устранена.

Комментарии от eryksun описывают детали - и именно это побудило меня поближе взглянуть на базу данных ошибок Python - так что, в конечном счете, именно в этом и заключается заслуга. Я просто заполняю его здесь, чтобы получить ответ и закрыть вопрос.

Эта ошибка затрагивает только среды Windows, но, к сожалению, она приводит к тому, что tempfile.TemporaryFile становится непригодным для использования в Windows для этого общего случая использования.

...