Найти - Пользователи
Полная версия: Замена time.sleep
Начало » Python для новичков » Замена time.sleep
1 2
Win95
Здравствуйте!
Пишу программу по работе с GUI приложениями и возникли некоторые трудности… Одно из приложений создает файл, а второе с ним работает. Проблема в том, что первому приложению требуется время для создания файла, а второе открывает (иногда еще не созданный до конца) файл практически мгновенно. Я могу регулировать время между запусками первого и второго приложения
import time
time.sleep(5)
Однако это очень условное время, т.к на разных конфигурациях ПК это будет занимать различное время, по этому и возник вопрос: Существует ли возможность дождаться завершения первой программы и затем выполнять вторую?
FishHook
Есть идиотское предложение заюзать еще один файл, в который пишется что-то вроде “ОК!” после создания основного файла.
beelze
Не совсем понятно, что подразумевается под «запусками процессов», разделенными time.sleep(). Это внешние процессы? Или что-то еще? В том и другом случае напрашивается использование threading и объектов синхронизации, к примеру threading.Event. В любом случае нобходим механизм определения того, что запись закончена. Это может быть как завершение «пишущего процесса», так и что-то еще - Вы не дали достаточно информации
Chern
Как вариант можно использовать locking файла. Но возникают платформо-зависимые нюансы
fata1ex
А еще говорят, что IT-образование программисту не нужно. У нас за такие sleep'ы можно было сразу отправляться на комиссию.

threading
multiprocessing

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

Имхо, если данный файл - единственная точка соприкосновения “приложений”, то ничего естественней блокировки средствами ОС в которой исполняется код нет
beelze
Chern, если «пишущее_приложение» начинает и заканчивает запись в произвольный момент времени, то предлагаемая блокировка опять-таки как-то должна быть синхронизируема с началом/концом этого события - каким-то образом. В таком случае она однако и ни к чему, поскольку может быть заменена на стандартные примитивы синхронизации, например контролирующие поток, запускающий «читающее_приложение». В любом случае универсальным но некроссплатформенным способом может быть отслеживание существования дескриптора целевого файла, принадлежащего «пишущему_приложению» - если оно, конечно, на забывает закрывать файл
А вообще, ТС, похоже, уже забыл о своем топике - или же какой-нить костыль прикрутил
Win95
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()
beelze
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

ну и наконец - никакой обработки ошибок. что не есть хорошо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB