Как проверить, открыт ли файл для записи в Windows на Python? - PullRequest
2 голосов
/ 09 ноября 2010

У нас здесь есть процесс, когда SAS создает входной файл. Этот входной файл затем читается унаследованным приложением, и это унаследованное приложение создает результаты. Затем SAS читает результаты и суммирует их. Непрограммист обычно заботится об этих действиях одно за другим. Таким образом, человек просто создает входной файл. Они знают, когда это будет сделано, а затем запускают устаревшее приложение и знают, когда это будет сделано. Затем они запускают сводную программу.

У меня есть ситуация, когда мой босс хочет запустить около 100 вариантов. У меня есть доступ к 3 или 4 компьютерам, которые используют общий сетевой диск. Вот мой план: используйте компьютер А, я начинаю создавать 100 входных файлов, один за другим. Используя компьютер B, я запускаю устаревшую программу для каждого входного файла. Я хотел бы запустить программу, когда ввод будет готов. Так что, если input1 уже создан на компьютере A, я хочу запустить устаревшее приложение на input1 на компьютере B, в то время как input2 создается на компьютере A. Я лучше знаю python, поэтому я, вероятно, буду использовать python, чтобы склеить все это вместе.

Теперь я знаю, что могу многое сделать, но я думаю, что этот подход является адекватным и позволит мне просто выполнить работу на данный момент. На самом деле у меня нет времени на разработку и тестирование очень элегантного решения, которое бы использовало все ядра на всех машинах или использовало базу данных, чтобы помочь мне синхронизировать все это. Я ценю такие предложения, , но я действительно просто хочу узнать, есть ли способ, в Python, сказать, открыт ли файл на сетевом диске для записи любым приложением на любом компьютере? Если нет Я, вероятно, просто придумаю тупой способ создать индикатор того, что работа выполнена - например, создать файл «doneA», где, если он существует, это означает, что файл «input1» завершен. Например. Я бы добавил шаг в программу sas, которая создает файл индикатора после создания входного файла.

Извините за очень длинное объяснение, но я просто не хочу, чтобы вы тратили время на альтернативные решения, которые я, вероятно, не смогу реализовать.

Я прочитал этот вопрос и ответы на него. Я не думаю, что могу использовать что-то вроде lsof b / c, эти файлы будут открыты на разных компьютерах.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Запись выходных данных во временный файл.Когда закончите писать, закройте его, затем переименуйте его в имя, которое ожидает другая программа.Таким образом, файл появляется только тогда, когда он готов для чтения.

1 голос
/ 09 ноября 2010

если в python есть способ определить, открыт ли файл на сетевом диске для записи любым приложением на любом компьютере?

Не совсем.

Windows позволит вам открыть файл несколько раз и действительно испортить все.

Вы должны использовать некоторую явную синхронизацию.Вместо того, чтобы синхронизировать каждый из трех шагов 100 различными способами, я предпочитаю сделать следующее.Создайте 100 копий трехступенчатого танца.Не беспокойтесь о синхронизации между шагами.

for variant in range(100):
    name= "variant_{0}.bat".format(variant)
    with open(name,"w") as script:
        print( "run some SAS thing", file=script )
        print( "run some legacy thing", file=script )
        print( "run some SAS thing", file=script )
    subprocess.Popen( "start {0}".format(name), shell=True )

Я подозреваю, что это сократит срок службы вашего процессора, запустив все 100 параллельно.

На практике вывероятно, не хочу использовать subprocess.Popen() в Python.С практической точки зрения вы, вероятно, захотите создать несколько таких пакетных файлов «start option_x», которые могут запускать несколько вариантов параллельно.Вы можете создать какой-нибудь мастер-файл bat, который запускает последовательность шагов обработки.Каждый шаг запускает несколько параллельных трехэтапных вариантов.

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