有很多关于如何完成以下操作的示例:
1)在同一程序中的不同进程之间进行通信。
2)在网络上的客户端/服务器之间进行通信。
但是,在我查找过的任何地方都没有一个好的例子来回答以下问题:
- 从Python程序A发送字符串到程序B的规范方法是什么?程序B需要阻止并处理该字符串,然后在循环中等待接收下一个字符串。
我觉得我多次接近答案,但从未成功创建一个可工作的示例。
附加隐含要求:
- 实际上是两个不同的程序:这个示例实际上需要两个不同的程序(即两个文件progA.py,progB.py,可以分别在同一台机器上的两个屏幕上从命令行分别运行),而不是使用任何类型的forking或multiprocess来创建客户端和服务器。
- 请建议一种允许发送可变长度的分隔符字符串的方法,而不必精确计算数据大小的字节数的方法(后者在实现时更容易出错)。
- 最好不使用localhost互联网连接。
例如,当读者使用:
pipein = open(pipe_name, 'r')
while program.KeepRunning:
action = pipein.readline()[:-1]
program.processLine(line)
time.sleep(1)
作者使用:
command = "enable"
pipeout = os.open(pipe_name, os.O_WRONLY)
os.write(pipeout, command)
os.write(pipeout, "\n")
如建议所述http://www.python-course.eu/pipes.php,读者在读取空字符串时会陷入无限循环。
有趣的是,在
program.processLine
函数中添加if(action == 'enable'): longFunction()
将导致longFunction
中的部分代码在永久阻塞读取空行之前被执行。另一方面,所有使用更现代且不那么低级的
subprocess
模块的示例都涉及多线程应用程序,而不是多个应用程序。其他实现涉及套接字和网络。虽然我尝试过利用套接字,但这会导致常见的“出了些问题”的错误,其中有许多可能的原因,例如
Error 111: "connection refused"
。由于python代码的一部分在接收特定命令时会修改网络配置(例如,它使用各种参数调用ip
、tc
和iptables
等命令),因此使用与localhost
的网络连接可能需要避免,这会导致难以调试且通常令人讨厌的问题。除非第二个程序在同一台机器上运行,否则不应该使用网络接口进行进程间通信。