![](/img/trans.png)
[英]Using String Parameters for Linux Desktopbus Interprocess Communication in Python
[英]Interprogram communication in python on Linux
关于如何执行这些操作的例子很多:
1)在同一程序的不同进程之间进行通信。
2)通过网络在客户端/服务器之间进行通信
但是,这个问题在我看过的任何地方都没有很好的例子:
我觉得我已经很接近答案了,但从未设法创建一个可行的示例。
其他隐含要求:
例如; 读者使用时:
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所建议的那样,读者陷入了无限循环,无法读出空字符串。
有趣的是,将if(action == 'enable'): longFunction()
到program.processLine
函数中会导致longFunction
中的部分代码被执行,直到永远无法读出空行。
另一方面,所有使用更现代的低级subprocess
模块的示例仅涉及多线程应用程序,而不涉及多个应用程序。 其他实现涉及套接字和网络。
当我尝试使用套接字时,这会导致一般性的“出问题”类型的错误,并可能有许多可能的原因Error 111: “connection refused”
显示为“某些时候”。 作为接收某些命令后执行的python代码的一部分,实际上是在利用与localhost
的网络连接来修改网络配置(例如,它使用各种参数调用诸如ip
, tc
和iptables
命令),这可能应该避免,从而导致调试和一般令人讨厌的问题。 除了第二个程序在同一台机器上运行不需要的部分之外,因此任何程序间通信都不需要使用网络接口。
这是预期的行为。 看看这个答案,了解类似的问题并了解FIFO行为。 与您的问题有关的部分是:
当没有更多的作家(...)时,通过
read()
返回EOF
通知读者。
file.readline()
文档说''
(空字符串)表示已达到EOF
:
如果
f.readline()
返回一个空字符串,则说明已到达文件的末尾,而空白行由'\\n'
,该字符串仅包含一个换行符。
而已。 在每次尝试读取的无限循环中,您会得到一个空字符串,这表明没有更多的编写器连接。
没有什么可以阻止您使用命名管道来解决您的任务。 最简单的方法是在没有作家的情况下睡上一段时间。 这是工作示例:
# server.py
import os
import time
pipe_name = 'pipe_test'
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
with open(pipe_name, 'r') as pipe:
print("Listening for actions...")
while True:
action = pipe.readline()[:-1]
if action == '':
print("No clients. Sleeping...")
time.sleep(1)
else:
print("Action received:", repr(action))
# client.py
import os
pipe_name = 'pipe_test'
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
print("Waiting for server to start...")
with open(pipe_name, 'w') as pipe:
action = input("Enter action to send: ")
pipe.write(action + '\n')
笔记:
os.open()
是低级功能,没有任何意义。 您可以使用open()
与命名管道进行交互。 Listening for actions...
。 从没有读者的作家开始的情况也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.