Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2012 10:19:11

Win95
От:
Зарегистрирован: 2011-11-04
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена time.sleep

Здравствуйте!
Пишу программу по работе с GUI приложениями и возникли некоторые трудности… Одно из приложений создает файл, а второе с ним работает. Проблема в том, что первому приложению требуется время для создания файла, а второе открывает (иногда еще не созданный до конца) файл практически мгновенно. Я могу регулировать время между запусками первого и второго приложения

import time
time.sleep(5)
Однако это очень условное время, т.к на разных конфигурациях ПК это будет занимать различное время, по этому и возник вопрос: Существует ли возможность дождаться завершения первой программы и затем выполнять вторую?



Офлайн

#2 Апрель 12, 2012 10:25:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Замена time.sleep

Есть идиотское предложение заюзать еще один файл, в который пишется что-то вроде “ОК!” после создания основного файла.



Офлайн

#3 Апрель 12, 2012 10:29:07

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

Не совсем понятно, что подразумевается под «запусками процессов», разделенными time.sleep(). Это внешние процессы? Или что-то еще? В том и другом случае напрашивается использование threading и объектов синхронизации, к примеру threading.Event. В любом случае нобходим механизм определения того, что запись закончена. Это может быть как завершение «пишущего процесса», так и что-то еще - Вы не дали достаточно информации

Отредактировано beelze (Апрель 12, 2012 10:31:10)

Офлайн

#4 Апрель 12, 2012 10:47:16

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

Как вариант можно использовать locking файла. Но возникают платформо-зависимые нюансы



Офлайн

#5 Апрель 12, 2012 13:22:33

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Замена time.sleep

А еще говорят, что IT-образование программисту не нужно. У нас за такие sleep'ы можно было сразу отправляться на комиссию.

threading
multiprocessing

PS. FishHook, o__O



Отредактировано fata1ex (Апрель 12, 2012 13:23:06)

Офлайн

#6 Апрель 12, 2012 13:51:39

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

блокировка файла имо не только некроссплатформенна но и невозможна при некоторых условиях, подпадающих под данное ТС определение задачи. Кроме того, если она возможна то очевидно не является самым изящным решением - ибо это искусственный дополнительный объект синхронизации, могущий быть с таким же успехом замененный штатными средствами (коль скоро допустимо вмешательство в код «приложения»)
Хотя очевидно, что ТС для начала должен ознакомиться с основными концепциями асинхронного выполнения кода, а иначе задача решена быть не может.

Офлайн

#7 Апрель 12, 2012 14:41:13

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

beelze

Имхо, если данный файл - единственная точка соприкосновения “приложений”, то ничего естественней блокировки средствами ОС в которой исполняется код нет



Офлайн

#8 Апрель 12, 2012 15:11:22

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

Chern, если «пишущее_приложение» начинает и заканчивает запись в произвольный момент времени, то предлагаемая блокировка опять-таки как-то должна быть синхронизируема с началом/концом этого события - каким-то образом. В таком случае она однако и ни к чему, поскольку может быть заменена на стандартные примитивы синхронизации, например контролирующие поток, запускающий «читающее_приложение». В любом случае универсальным но некроссплатформенным способом может быть отслеживание существования дескриптора целевого файла, принадлежащего «пишущему_приложению» - если оно, конечно, на забывает закрывать файл
А вообще, ТС, похоже, уже забыл о своем топике - или же какой-нить костыль прикрутил

Офлайн

#9 Апрель 12, 2012 15:31:52

Win95
От:
Зарегистрирован: 2011-11-04
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена time.sleep

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()



Офлайн

#10 Апрель 12, 2012 16:24:51

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Замена time.sleep

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

ну и наконец - никакой обработки ошибок. что не есть хорошо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version