在每条python代码语句之间添加时间延迟

时间:2018-08-15 19:39:26

标签: python win32com sap-gui

是否有一种简单的方法可以在每个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"

4 个答案:

答案 0 :(得分:2)

您想要在程序中发生的任何事情都必须明确说明-这是编程的本质。这就像询问您是否可以在不调用hello world的情况下打印print("hello world")一样。

答案 1 :(得分:2)

正确执行任务的方法几乎肯定是使用调试器pdb

想要的正确方法可能完全不同:找到一些信号,告诉您该步骤已完成,然后等待该信号。遇到这样的问题,几乎您选择的任何时间都是99%的时间太长,但仍然有1%的时间太短。该信号可能是join线程,或wait在(threadingmultiprocessingCondition上,或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)

使用调试模式并逐行监视每一行。