首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python3 flask pyserial脚本只能运行一次

python3 flask pyserial脚本只能运行一次
EN

Stack Overflow用户
提问于 2017-10-12 01:30:25
回答 1查看 300关注 0票数 0

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

它应该通过Ajax调用一个基于Flask的网站(整个网站应作为ajax接收器来执行python脚本)。

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

代码语言:javascript
复制
...
@app.route("/cashdrawer")
def cashdrawer():
        import cash_drawer_open
        return "open ?"   # website output
...

现金抽屉开启器cash_drawer_open.py看起来像这样

代码语言:javascript
复制
#!/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 ?,抽屉保持平静。唯一一件事就是终端响应

代码语言:javascript
复制
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 -

再三。

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

代码语言:javascript
复制
http://myserver/cashdrawer?t=12765435664543

但没有成功。

你知道我怎么才能在每次打电话给地址的时候和USB设备通话吗?谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-10-12 01:37:46

你的错误是假设导入是在执行代码。这只是第一次,之后的import语句只给你一个缓存的模块实例。

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

  1. cash_drawer_open中的实际逻辑(除导入之外的任何内容)放入一个函数
  2. 将web应用程序中的cash_drawer_open导入放到它所属的模块顶部
  3. 当前导入的位置,而不是调用步骤1中定义的函数

<代码>G29

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46694275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档