Форум сайта python.su
0
Здравствуйте!
Пишу программу по работе с GUI приложениями и возникли некоторые трудности… Одно из приложений создает файл, а второе с ним работает. Проблема в том, что первому приложению требуется время для создания файла, а второе открывает (иногда еще не созданный до конца) файл практически мгновенно. Я могу регулировать время между запусками первого и второго приложения
import time time.sleep(5)
Офлайн
568
Есть идиотское предложение заюзать еще один файл, в который пишется что-то вроде “ОК!” после создания основного файла.
Офлайн
3
Не совсем понятно, что подразумевается под «запусками процессов», разделенными time.sleep(). Это внешние процессы? Или что-то еще? В том и другом случае напрашивается использование threading и объектов синхронизации, к примеру threading.Event. В любом случае нобходим механизм определения того, что запись закончена. Это может быть как завершение «пишущего процесса», так и что-то еще - Вы не дали достаточно информации
Отредактировано beelze (Апрель 12, 2012 10:31:10)
Офлайн
3
Как вариант можно использовать locking файла. Но возникают платформо-зависимые нюансы
Офлайн
52
А еще говорят, что IT-образование программисту не нужно. У нас за такие sleep'ы можно было сразу отправляться на комиссию.
threading
multiprocessing
PS. FishHook, o__O
Отредактировано fata1ex (Апрель 12, 2012 13:23:06)
Офлайн
3
блокировка файла имо не только некроссплатформенна но и невозможна при некоторых условиях, подпадающих под данное ТС определение задачи. Кроме того, если она возможна то очевидно не является самым изящным решением - ибо это искусственный дополнительный объект синхронизации, могущий быть с таким же успехом замененный штатными средствами (коль скоро допустимо вмешательство в код «приложения»)
Хотя очевидно, что ТС для начала должен ознакомиться с основными концепциями асинхронного выполнения кода, а иначе задача решена быть не может.
Офлайн
3
beelze
Офлайн
3
Chern, если «пишущее_приложение» начинает и заканчивает запись в произвольный момент времени, то предлагаемая блокировка опять-таки как-то должна быть синхронизируема с началом/концом этого события - каким-то образом. В таком случае она однако и ни к чему, поскольку может быть заменена на стандартные примитивы синхронизации, например контролирующие поток, запускающий «читающее_приложение». В любом случае универсальным но некроссплатформенным способом может быть отслеживание существования дескриптора целевого файла, принадлежащего «пишущему_приложению» - если оно, конечно, на забывает закрывать файл 
А вообще, ТС, похоже, уже забыл о своем топике - или же какой-нить костыль прикрутил 
Офлайн
0
beelze- это интересно… и видимо мне правда придется раскурочить используемые бинарники…
может быть отслеживание существования дескриптора целевого файла, принадлежащего «пишущему_приложению» - если оно, конечно, на забывает закрывать файл
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import time import pywinauto from pywinauto import application pwa_app = pywinauto.application.Application() #Запуск генератора gen = application.Application.start("C:\Sound v1.0\gen.exe") #Обработчик кнопки Start '''gen.generator.Start.Click()''' #Даем время для холостого хода генератора 40с time.sleep(2) #Открываем audio app = application.Application.start("C:\Sound v1.0\Free.exe") #Даем время для загрузки программы time.sleep(1) #Привязываемся к audio и записываем w_handle = pywinauto.findwindows.find_windows(title_re=u'Free Audio Recorder 6.3.5', class_name='#32770')[0] window = pwa_app.window_(handle=w_handle) window.SetFocus() #Записываем (запись останавливается через 40с автоматически) window.MenuItem(u'&Action->Record\tCtrl+R').Click() #Даем время для сохранения файла, затем закрываем программы time.sleep(62) #Закрытие программы записи window.MenuItem(u'&File->Exit').Click() #Закрытие генератора gen.Dialog.MenuSelect("Files->Exit") #Открываем Cool Edit apps = application.Application.start("C:\\audio\coolpro\coolpro.exe") #Выбираем файл mp3 apps.coolpro.MenuSelect("File->Open...") apps.Dialog.ComboBox3.Select("c:\\sound v1.0") apps.Dialog.ComboBox2.Select("All files (*.*)") apps.Dialog.edit1.SetText("Untitled.mp3") apps.Dialog.Button1.Click() #Отвязываемся от окна apps.coolpro.File.Click() #Сохраняем файл как txt apps.coolpro.MenuSelect("File->Save As...") apps.Dialog.ComboBox2.Select("ASCII Text Data (*.txt)") apps.Dialog.edit1.SetText("Untitled.txt") apps.Dialog.ComboBox3.Select("c:\\sound v1.0") apps.Dialog.Button1.Click() #Обязательно должен существовать предыдущий файл Untitled.txt, иначе ошибка apps.Dialog.Button1.Click() time.sleep(5) #Закрытие Cool Edit apps.coolpro.MenuSelect("File->Exit Ctrl+Q") #Удаление mp3 файла time.sleep(5) os.remove('Untitled.mp3') #Удаление первых 5 строк из полученного текстового файла (системная информация) def text(): sev = open('C:\Sound v1.0\Untitled.txt', 'r') f = open('C:\Sound v1.0\RUN_ME.txt', 'w') res= sev.readlines() del res[4] del res[3] del res[2] del res[1] del res[0] f.writelines(res) f.close() sev.close() print 'Process Complete' text()
Офлайн
3
Win95, код, конечно, страшненький
, но дело не сколько в этом, сколь в другом - само подобное управление гуевыми приложениями - крайний, костыльный и чреватый метод. А что, собственно вообще делается вышеприведенным кодом? Возможно, 1) эквивалент можно реализовать модулями, которые уже кто-то свелосипедил или 2) найти утилки, работающие как скрипты (использующие стандартный ввод/вывод) - что упростит Ваш код до нескольких строк
Ну и что бросилось в глаза:
del res[4] del res[3] del res[2] del res[1] del res[0]
>>> a='abcdefgh' >>> a[5:] 'fgh'
with open(file, 'rb') as f: statements
Офлайн