python3 flask pyserial脚本只工作一次

python3 flask pyserial脚本只工作一次,python,ajax,flask,pyserial,Python,Ajax,Flask,Pyserial,我想编写一个脚本来打开现金抽屉,使用串行设备(带USB),而不是每次打印机打印时都打开它(例如,在信用卡付款时,不需要打开现金抽屉) 它应该通过对基于Flask的网站的Ajax调用来工作(整个网站应该充当Ajax接收器来执行python脚本) Flask网站正在运行,其他脚本正在运行,没有问题,这就是为什么我在这里只显示主脚本中有趣的部分: ... @app.route("/cashdrawer") def cashdrawer(): import cash_drawer_ope

我想编写一个脚本来打开现金抽屉,使用串行设备(带USB),而不是每次打印机打印时都打开它(例如,在信用卡付款时,不需要打开现金抽屉)

它应该通过对基于Flask的网站的Ajax调用来工作(整个网站应该充当Ajax接收器来执行python脚本)

Flask网站正在运行,其他脚本正在运行,没有问题,这就是为什么我在这里只显示主脚本中有趣的部分:

...
@app.route("/cashdrawer")
def cashdrawer():
        import cash_drawer_open
        return "open ?"   # website output
...
现金抽屉开启器
cash\u drawer\u open.py
看起来像这样

#!/usr/bin/python3
import serial

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=300,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    xonxoff=serial.XOFF,
    rtscts=False,
    dsrdtr=False
)

ser.write(bytes([0, 4]))

ser.flush()        # something
ser.flushInput()   # I played
ser.flushOutput()  # around
ser.close()        # with
# exit()           # etc.
# quit()           # etc.

print ("open ?")   # terminal output
问题是,在Flask服务器启动并第一次调用脚本之后,抽屉只打开一次。同一网站的每一次呼叫都不会在终端中返回
open?
,抽屉保持平静。唯一的问题是终端响应

192.168.178.29 - - [11/Oct/2017 18:31:56] "GET /cashdrawer HTTP/1.1" 200 -
192.168.178.29 - - [11/Oct/2017 18:31:58] "GET /cashdrawer HTTP/1.1" 200 -
192.168.178.29 - - [11/Oct/2017 18:32:03] "GET /cashdrawer HTTP/1.1" 200 -
一次又一次

我还尝试用参数调用它,比如更改时间戳

http://myserver/cashdrawer?t=12765435664543
但是没有成功


你知道我如何在每次呼叫该地址时与USB设备通话吗?谢谢

您的错误是假定导入正在执行代码。这只是第一次,之后import语句只会将缓存的模块实例传递给您

因此,用三个简单的步骤重构代码:

  • 将实际逻辑(导入除外)放入
    cash\u drawer\u open
    转化为函数
  • 将web应用程序中导入的
    现金\u抽屉\u打开
    放在它所属模块的顶部
  • 在当前导入位置,调用步骤1中定义的函数

  • 好的,现在我在主脚本的顶部有了
    def import\u cashdrawer():import cash\u drawer\u open
    ,并且
    @app.route(“/cashdrawer”)def cashdrawer():import\u cashdrawer()在route函数中返回“open now?”
    ,但结果相同,它只工作一次。我在这里不能得到什么?啊。。。我明白了。。。瞬间。让我完全困惑:当我从平板电脑浏览器调用页面时,它就像预期的那样工作。当我使用带有Safari或FF的MacBook时,页面会一直挂起/冻结,直到我从平板电脑再次调用该页面。然后它发射两次。。。啊!找到答案:像这样激活线程
    app.run(host='0.0.0.0',threaded=True,debug=True)