Используя Python, как мне закрыть файл, используемый другим пользователем по сети? - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть программа, которая создает кучу файлов фильмов. Я выполняю задание cron, и каждый раз, когда запускаются фильмы из предыдущей итерации, они перемещаются в «предыдущую» папку, так что всегда есть предыдущая версия для просмотра.

Эти видеофайлы доступны по сети различным пользователям, и вот тут я сталкиваюсь с проблемой.

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

Дополнительные уточнения:

JMax прав, когда упоминает, что это проблема уровня сервера. Я могу получить доступ к нашему серверу Windows через «Администрирование»> «Управление компьютером»> «Общие папки»> «Открыть файлы» и вручную закрыть там файлы, но мне интересно, есть ли эквивалент Python, который даст тот же результат.

примерно так:

try:

    shutil.move(src, dst)

except OSError:

  # Close src file on all machines that are currently accessing it and try again.  

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

Этот вопрос не имеет ничего общего с Python, и все, что связано с конкретной операционной системой и файловой системой, которую вы используете. Не могли бы вы предоставить эти данные?

По крайней мере, в Windows вы можете использовать Sysinternals Handle для принудительного закрытия определенного дескриптора файла. Тем более, что этот файл открывается другим пользователем по сети, эта операция чрезвычайно дестабилизирует и, вероятно, впоследствии сделает сетевое соединение бесполезным. Вы ищете аргумент командной строки "-c", где документация гласит:

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

ПРЕДУПРЕЖДЕНИЕ. Закрывание рукояток может вызвать нестабильность приложения или системы.

И если вы принудительно закрываете файл, смонтированный над Samba в Linux, то, судя по опыту, это мучительный опыт в бесполезности. Однако другие пытались с переменным успехом; см. Принудительное закрытие файла процессом Samba .

0 голосов
/ 27 сентября 2011

Метод .close() не работает с вашим объектным файлом?

См. погружение в Python для получения дополнительной информации о файловых объектах

[ПРАВИТЬ] Я перечитал ваш вопрос. Ваша проблема в том, что пользователи открывают один и тот же файл из сети, и вы хотите, чтобы они закрыли файл? Но можете ли вы получить доступ к их ОС?

[EDIT2] Проблема больше на уровне сервера, чтобы отключить пользователя, который получает доступ к файлу. См. этот пример для серверов Windows.

0 голосов
/ 27 сентября 2011

Насколько я знаю, вам нужно завершить процессы, которые обращаются к файлу.По крайней мере, на Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...