【问题标题】:How to get a python script to listen for inputs from another script如何让 python 脚本监听来自另一个脚本的输入
【发布时间】:2013-09-12 23:09:22
【问题描述】:

我有一种情况,我需要一个 python 脚本在一个连续循环中运行,并且我需要从另一个脚本传递参数到它,该脚本将在一个动作发生时运行。

第二个脚本将由使用 cgi 的网站触发,我可以正常工作。连续循环应该接受 cgi 脚本读取的参数(然后通过串口发送信息)。

对于特定问题,我不能让 cgi 脚本直接通过串行发送数据,因为每次运行它都会重置串行端口。

我似乎找不到任何关于这种设置的信息。是否有任何方法或库我可以研究这个或更好的方法来处理它?

【问题讨论】:

  • 你有没有想过让第二个脚本运行flask或其他东西并接受参数作为http get参数?

标签: python serial-port cgi


【解决方案1】:

我会使用套接字连接。本质上,您正在编写一个非常简单的服务器,一次只需要一个连接

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 9988))
s.listen(1)

while True:
    conn, addr = s.accept()
    data = conn.recv(1024)
    conn.close()
    my_function_that_handles_data(data)

s.accept() 是一个阻塞调用。它等待连接。然后你阅读连接。在这种情况下,我们假设参数的长度仅为 1024 字节。然后我们对从套接字接收到的数据做一些事情并等待另一个连接。

客户端可能如下所示:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 9988))
s.sendall('My parameters that I want to share with the server')
s.close()

这样做的好处是,如果将来客户端和服务器不再在同一台机器上运行,那么只需将"localhost" 更改为您要访问的实际 IP 地址或域名即可。

【讨论】:

  • 这看起来可能很完美,我之前偶然发现了套接字,但不确定它们是如何工作的或如何使用它们,感谢这个简单的例子。稍后会尝试。
  • 套接字非常灵活。您可以创建许多不同类型的套接字。他们不必跨越网络。如果您使用的是 Linux,您可以创建一个仅通过内核路由的域套接字。
  • 下一步是创建一个服务器来存储连接并使用 epoll 来通知每次有一些数据要从中读取。在不知不觉中,您已经编写了一个异步套接字服务器。
  • 这听起来很有趣,但我不确定我是否理解...你建议我研究一下吗?我打算使用它的方式是拥有一个网站(移动设备),上面有一些控件(开、关、速度滑块),该网站将用于控制 DIY 四轴飞行器(树莓派和 arduino)。您的代码现在可以让网站正确地传递命令,您能在这里看到异步套接字服务器的用途吗?
  • 异步(epoll)在您对资源有高需求(即:许多并发用户)时很有用。当一个用户在等待一个特定的资源时,服务器进程可以为下一个用户提供服务,或者处理其他资源。如果您的网站旨在让单个用户控制四轴飞行器,那么阻塞(等待资源)应该不是问题。
【解决方案2】:

您所描述的一般概念称为进程间通信 (Python IPC)。

在 python 中,这可以通过 sockets 和 signals 来完成。

还有建立在/使用套接字之上的更高级别的接口; asyncore 和 asynchat。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多