Добавить задержку между каждым оператором кода Python
Есть ли простой способ выполнить задержку (например, time.sleep(3)
) между каждым оператором кода Python без необходимости явной записи между каждым оператором?
Как в приведенном ниже скрипте Python, который выполняет определенные действия в окне SAP GUI. Иногда сценарий переходит к следующему оператору, прежде чем предыдущий оператор будет завершен. Поэтому мне пришлось добавить задержку между каждым оператором, чтобы он выполнялся правильно. Это работает с задержкой, но я заканчиваю тем, что добавил time.sleep(3)
между каждой строкой. Просто интересно, есть ли лучший способ?
import win32com.client
import time
sapgui = win32com.client.GetObject("SAPGUI").GetScriptingEngine
session = sapgui.FindById("ses[0]")
def add_record(employee_num, start_date, comp_code):
try:
time.sleep(3)
session.findById("wnd[0]/tbar[0]/okcd").text = "/npa40"
time.sleep(3)
session.findById("wnd[0]").sendVKey(0)
time.sleep(3)
session.findById("wnd[0]/usr/ctxtRP50G-PERNR").text = employee_num
time.sleep(3)
session.findById("wnd[0]").sendVKey(0)
time.sleep(3)
session.findById("wnd[0]/usr/ctxtRP50G-EINDA").text = start_date
time.sleep(3)
session.findById("wnd[0]/usr/tblSAPMP50ATC_MENU_EVENT/ctxtRP50G-WERKS[1,0]").text = comp_code
time.sleep(3)
session.findById("wnd[0]/usr/tblSAPMP50ATC_MENU_EVENT/ctxtRP50G-PERSG[2,0]").text = "1"
time.sleep(3)
session.findById("wnd[0]/usr/tblSAPMP50ATC_MENU_EVENT/ctxtRP50G-PERSK[3,0]").text = "U1"
time.sleep(3)
session.findById("wnd[0]/usr/tblSAPMP50ATC_MENU_EVENT").getAbsoluteRow(0).selected = True
time.sleep(3)
return "Pass"
except:
return "failed"
4 ответа
Правильный способ сделать то, что вы просили, это почти наверняка использовать отладчик, pdb
,
Правильный способ сделать то, что вы хотите, возможно, что-то совершенно другое: найти какой-то сигнал, который говорит вам, что шаг выполнен, и дождаться этого сигнала. С такими проблемами почти всегда, когда вы выбираете, это будет слишком долго, 99% времени, но все равно слишком мало 1% времени. Этот сигнал может быть join
нить или wait
наthreading
или же multiprocessing
) Condition
, или же get
звонить из очереди или await
в сопрограмму или будущее, или настройку sync
флаг на AppleEvent, или... Это действительно зависит от того, что вы делаете.
Но если вы действительно хотите сделать это, вы можете использовать settrace
:
def sleeper(frame, event, arg):
if event == 'line':
time.sleep(2)
return sleeper
sys.settrace(sleeper)
Одна небольшая проблема заключается в том, что понятие строки, используемое интерпретатором, вполне может бытьне тем, что вы хотите. Вкратце, 'line'
событие трассировки запускается всякий раз, когда цикл ceval переходит к другомуlnotab
запись (см. lnotab_notes.txt
в источнике, чтобы понять, что это значит - и вам, вероятно, понадобится хотя бы мимолетное понимание того, как интерпретируется байт-код, хотя бы из чтения dis
документы, чтобы понять это). Так, например, многострочное выражение представляет собой одну строку; линия with
заявление может появиться дважды, и т. д.1
И есть, вероятно, еще большая проблема.
Иногда сценарий переходит к следующему шагу до полного завершения предыдущего шага.
Я не знаю, что это за шаги, но если вы переведите весь поток в спящий режим на 2 секунды, есть большая вероятность, что ожидаемый вами шаг не даст никакого прогресса, потому что поток спит. (Например, вы не зацикливаетесь ни на каких асинхронных или графических циклах событий, потому что вы вообще ничего не делаете.) Если это так, то через 2 секунды оно все равно будет таким же неполным, как и раньше, и вы потратил 2 секунды впустую.
1. Если ваше представление о "строке" ближе к тому, что описано в справочных документах по лексингу и синтаксическому анализу Python, вы можете создать ловушку импорта, которая обходит AST и добавляет выражение выражения сCall
вtime.sleep(2)
после каждого элемента списка в каждом body
с модулем, определением или составным оператором (а затем компилирует и исполняет результат как обычно).
Все, что вы хотите, чтобы происходило в программе, должно быть четко указано - такова природа программирования. Это все равно что спросить, можете ли вы напечатать hello world
без звонка print("hello world")
,
Я думаю, что лучший совет, который вам следует здесь дать: не думать с точки зрения "линий", а думать с точки зрения функций.
Используйте режим отладки и следите за каждой строкой, выполняя построчно.