有很多关于如何找到这些东西的例子:
1)在同一程序中的不同进程之间进行通信.
2)通过网络在客户端/服务器之间进行通信
但是,这个问题在我看过的任何地方都没有很好的例子:
我觉得我已经多次接近答案,但从未设法创造一个有效的例子.
其他隐含要求:
例如; 读者使用时:
pipein = open(pipe_name, 'r')
while program.KeepRunning:
action = pipein.readline()[:-1]
program.processLine(line)
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
而作者使用:
command = "enable"
pipeout = os.open(pipe_name, os.O_WRONLY)
os.write(pipeout, command)
os.write(pipeout, "\n")
Run Code Online (Sandbox Code Playgroud)
正如http://www.python-course.eu/pipes.php 所建议的那样,读者陷入无限循环中,读出空字符串.
有趣的是,添加if(action == 'enable'): longFunction()到program.processLine函数会导致longFunction正在执行的部分代码在被卡住读取空行之前永久存在.
另一方面,利用更现代的低级别subprocess模块的所有示例仅涉及多线程应用程序,而不涉及多个应用程序.其他实现涉及套接字和网络.
虽然我尝试使用套接字,但这会导致通用的"出错"类型错误,其中有许多可能的原因会Error 111: “connection refused”出现"某些时候".作为在接收到的某些命令执行的Python代码的一部分实际修改网络配置(例如,它调用诸如命令ip,tc并iptables与各种参数)利用网络连接到localhost的东西,可能应该避免,从而导致难以调试和通常讨厌的问题.除了第二个程序在同一台机器上运行时不必要的部分,因此任何程序间通信都不需要使用网络接口.
这是有意的行为。请查看此答案以了解类似问题以及 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))
Run Code Online (Sandbox Code Playgroud)
# 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')
Run Code Online (Sandbox Code Playgroud)
笔记:
os.open(),它是低级函数。您可以使用open()命名管道进行交互。Listening for actions...因此,在第一个客户端连接到管道之前,您不会在输出中看到。对于没有读者的作家来说也是如此。