如何在python脚本中创建语句就像在交互式shell中执行它们一样

时间:2011-08-18 01:06:20

标签: python pyserial

我有一台连接到串行通讯端口的仪器。我在Windows XP中使用Python 3.2,加上pySerial模块。我执行一个脚本时遇到问题,该脚本由一系列语句组成,这些语句打开通信端口,配置它,向其写入字符串并从中接收字符串。 Thoese strings aer指示与仪器相关的命令(控制)或来自仪器的响应(响应)。

当这些语句以交互方式在python解释器中执行时(在>>>),我得到了我期望的结果,并且结果是正确的。但是,当我在解释器或shell中执行脚本时,我得不到我想要的。脚本中的语句与我在交互式解释器中使用的语句相同。

为什么我会得到奇怪的行为?如何更改脚本以使其在交互式解释器中表现得像?

def read(comport):

    wrt_str=b'movt 3000'+b'\r\n'
    ret_str=comport.write(wrt_str)

    wrt_str=b'scan'+b'\r\n'
    ret_str=comport.write(wrt_str)

    rsp_str=comport.readlines() #########1

    wrt_str=b'hllo'+b'\r\n'
    ret_str=comport.write(wrt_str)

    rsp_str=comport.readlines()#########2

问题在于上面的行#######。在交互模式下,在#1处有大约1秒的延迟,在#2处有9个延迟。我在那里得到了正确答案。但是,如果我执行上面的脚本,根本没有延迟,我得到不正确的结果(垃圾)。我在通讯端口设置中将读取超时设置为0,为

comport.timeout=0

因此,如果等待行结束或文件结束,则comport应处于阻塞模式。

更新(2011年8月19日)

我对几天前发的原帖有更新。我想我知道问题是什么,想知道是否有人有解决方案:

在每个语句之后放入“print”和“time.sleep(delay)”后,我发现当脚本运行时,它会出现在pyserial语句周围,例如“comport.write(..)”或“ comport.readlines(...)“当pyserial命令正在执行时(出现等待和忙碌做某事,你知道串口很慢)。因此,例如,当我在python交互式shell中执行所有语句时,如果未返回前一个语句,则无法键入并运行新语句。让我们,如果comport.readlines()没有返回,我无法输入并运行下一个comport.write(...)statemtn。但是,在正在运行的脚本中,如果comport.readlines()忙于读取,则下一个语句正在运行,如果下一个语句恰好是comport.write(),它将中止读取。

有没有办法强制python脚本表现得像按顺序运行?

3 个答案:

答案 0 :(得分:2)

我读了pyserial的文件:

timeout = None: wait forever
timeout = 0: non-blocking mode (return immediately on read)
timeout = x: set timeout to x seconds (float allowed)

如果设置comport.timeout = 0,那么readlines()将立即返回。尝试set comport.timeout = 10.

答案 1 :(得分:1)

我会尝试将每个命令字符串粘贴到自己的函数中,然后按顺序调用它们,并暂停。

或者,如果您知道输出数据字符串的长度,可以将read() / readlines()设置为在经过多个字节后停止读取,或者如果读取字符串则设置为任意数字是可变长度。

答案 2 :(得分:0)

尝试在每个time.sleep(1)后暂停一下(例如comport.write)。这将使设备有时间在您查找响应之前响应每个命令。

作为HYRY points out,将timeout设置为0会立即返回,因此它不会按照您的想法执行操作。除此之外,当您一次执行一个语句时,在每行输入时会有一个延迟。当您在脚本中执行它们时,它们之间没有太大差距。