是否有一种简单的方法可以在每个Python代码语句之间执行时间延迟(如time.sleep(3)
),而不必在每个语句之间显式编写?
就像下面的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"
答案 0 :(得分:2)
您想要在程序中发生的任何事情都必须明确说明-这是编程的本质。这就像询问您是否可以在不调用hello world
的情况下打印print("hello world")
一样。
答案 1 :(得分:2)
正确执行任务的方法几乎肯定是使用调试器pdb
。
做想要的正确方法可能完全不同:找到一些信号,告诉您该步骤已完成,然后等待该信号。遇到这样的问题,几乎您选择的任何时间都是99%的时间太长,但仍然有1%的时间太短。该信号可能是join
线程,或wait
在(threading
或multiprocessing
)Condition
上,或get
队列,或者await
编写协程或将来,或者在AppleEvent上设置sync
标志,或者……这实际上取决于您在做什么。
但是,如果您确实要执行此操作,则可以使用settrace
:
def sleeper(frame, event, arg):
if event == 'line':
time.sleep(2)
return sleeper
sys.settrace(sleeper)
一个小问题是,解释器使用的行的概念很可能不是您想要的。简而言之,每当ceval循环跳转到另一个'line'
条目时,就会触发一个lnotab
跟踪事件(请参阅源代码中的lnotab_notes.txt
以了解其含义,并且您可能至少需要至少通过阅读dis
文档才能理解字节码的理解方式)。因此,例如,多行表达式是单行; with
语句的行可能出现两次,依此类推。 1
可能还有一个更大的问题。
有时,脚本会在上一步完全完成之前继续进行下一步。
我不知道这些步骤是什么,但是如果您将整个线程睡眠2秒钟,那么您正在等待的步骤很有可能不会取得任何进展,因为该线程处于睡眠状态。 (例如,您没有在任何异步或GUI事件循环中循环,因为您什么都不做。)如果是这样,那么2秒钟后,它仍然会像以前一样不完整,您会浪费2秒,一无所获。
1。如果您对“行”的概念更接近the reference docs on lexing and parsing Python中的描述,则可以创建一个导入钩子来遍历AST,并在每个列表之后向Call
添加一个带有time.sleep(2)
的表达式语句每个body
中的元素具有模块,定义或复合语句(然后照常编译和执行结果)。
答案 2 :(得分:1)
我认为在这里给您最好的建议是:不要以“线条”来思考,而是要以功能来考虑。
答案 3 :(得分:-2)
使用调试模式并逐行监视每一行。