Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux上的python中的程序间通信大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

有很多关于如何找到这些东西的例子: 1)在同一程序中的不同进程之间进行通信. 2)通过网络在客户端/服务器之间进行通信 但是,这个问题在我看过的任何地方都没有很好的例子: >从python程序A向程序B发送字符串的规范方法是什么,它阻止并处理该字符串,然后在循环中等待另一个字符串? 我觉得我已经多次接近答案,但从未设法创造一个有效的例子. 其他隐含要求: >实际上有两个不同的程序:该示例需要实际上
有很多关于如何找到这些东西的例子:

1)在同一程序中的不同进程之间进行通信.@H_197_21@

2)通过网络在客户端/服务器之间进行通信@H_197_21@

但是,这个问题在我看过的任何地方都没有很好的例子:@H_197_21@

>从python程序A向程序B发送字符串的规范方法是什么,它阻止并处理该字符串,然后在循环中等待另一个字符串?@H_197_21@

我觉得我已经多次接近答案,但从未设法创造一个有效的例子.@H_197_21@

其他隐含要求:@H_197_21@

>实际上有两个不同的程序:该示例需要实际上有两个不同的程序(即两个文件progA.py,progB.py可以在同一台机器上的两个屏幕中从命令行单独运行),不使用任何类型的分叉或multiprocess来创建客户端和服务器.
>请建议一种方法,允许发送长度合理的可变长度分隔字符串,而不是必须得到正确的数据大小的确切字节数. (后者在实现中更@R_616_10197@).
>理想情况下,不使用localhost互联网连接即可@H_197_21@

例如;读者使用时:@H_197_21@

pipein = open(pipe_name,'r')
while program.KeepRunning:
    action = pipein.readline()[:-1]
    program.processLine(linE)
    time.sleep(1)

而作者使用:@H_197_21@

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所建议的那样
读者陷入无限循环,读出空字符串.@H_197_21@

有趣的是,在program.processLine函数添加if(action ==’enable’):longFunction()会导致longFunction中的部分代码被执行,然后才能永久地读出空行.@H_197_21@

另一方面,利用更现代的低级别子流程模块的所有示例仅涉及多线程应用程序,而不涉及多个应用程序.其他实现涉及套接字和网络.@H_197_21@

然我尝试使用套接字,但这会导致通用的“出错”类型错误,导致许多可能的原因错误111:“连接拒绝”显示“某些时间”.作为在接收某些命令时执行的python代码的一部分,实际@L_874_16@网络配置(例如,它使用各种参数调用ip,tc和iptables等命令)利用到localhost的网络连接是可能应该避免的,导致困难调试和一般讨厌的问题.除了第二个程序在同一台机器上运行时不必要的部分,因此任何程序间通信都不需要使用网络接口.@H_197_21@

解决方法

这是预期的行为.请查看 this answer以了解类似问题和FIFO行为概述.与您的问题相关的部分是:

file.readline()docs说”(空字符串)表示已达到EOF:@H_197_21@

而已.在每次尝试读取的无限循环中,您将获得一个空字符串,表示没有连接的编写器.@H_197_21@

没有什么可以阻止您使用命名管道来解决您的任务.最简单的方法就是在没有作家的情况下睡一段时间.这是工作示例:@H_197_21@

# 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')

笔记:@H_197_21@

>使用os.open()是没有意义的,它是低级函数.您可以使用open()与命名管道进行交互.
>打开命名管道以读取@L_696_29@,直到连接第一个作者.因此,在第一个客户端连接到管道之前,您不会在输出中看到“侦听操作…”.作家也是如此,没有读者就开始了.>您要求“阻止并处理此字符串,然后在循环中等待另一个字符串”.除非您在单独的线程中处理字符串,否则在处理当前字符串之前不会尝试读取下一个字符串.@H_197_21@

大佬总结

以上是大佬教程为你收集整理的Linux上的python中的程序间通信全部内容,希望文章能够帮你解决Linux上的python中的程序间通信所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。