也许这是错误的方法,所以请随意重定向.

我正在try 将输入同步传输到Python脚本中.我的 idea 是,我有一个后台Python脚本,执行一些较长的初始设置功能,然后等待输入.接收到输入后,脚本将执行更多功能并返回等待输入.这不会在无头服务器上,因此这不是"用户输入"

这是我的 playbook :

import sys

# do some long functions

sys.stdin.flush()

data=""

while(1)
    data = sys.stdin.read()
    if data != "":
        print("input: " + data)
        sys.stdin.flush()
    data=""
exit()

我在Ubuntu 22.04上.在一个终端中,我使用以下命令运行脚本:python3 rx.py</tmp/py-srv.input & echo $!>/tmp/py-srv.pid 这会创建一个pid文件,以便我稍后可以杀死它,并创建一个我可以写入以输入到脚本中的输入文件.

在另一个终端中,我写入输入文件:echo "test">/tmp/py-srv.input

在第一个航站楼我看到:input: test耶!它工作...

但如果我try 再次写入输入文件echo "YAY!">/tmp/py-srv.input,我在第一个终端上什么也没有得到.

不过,偶尔会出现这样的情况,如果我第二次写echo "testYAY!">/tmp/py-srv.input,我在第一个终端就会得到input: AY!.

我查看了. entry文件,注意到它在读取第一个输入后被清除,但在后续读取后不会被清除.这就是添加sys.stdin.flush()的原因,但这并没有解决任何问题.

我try 使用entry()函数,但得到一个EOFError: EOF when reading a line错误,我认为这是由于使用单个&启动脚本作为后台进程

看起来我已经很接近了,但它不适用于多次输入写入.我是否缺少Python的sys.stdin?为什么stdin.read()看不到对. select文件的第二次写入,除非它以第一次写入的字符串开始?

任何帮助都会很大,谢谢.

推荐答案

我认为最好使用FIFO而不是普通文件来与这样的服务器通信. 以下是一个简单的例子:

服务器 :

import os

os.mkfifo('py-srv.fifo')

while True:
    with open('py-srv.fifo') as f:
        data = f.read()
        print('input:', data)

客户 :

with open('py-srv.fifo', 'w') as f:
    f.write('hello')

Python相关问答推荐

在Pandas 日历中插入一行

Pandas 第二小值有条件

DataFrame groupby函数从列返回数组而不是值

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

Pytest两个具有无限循环和await命令的Deliverc函数

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

如何使用SentenceTransformers创建矢量嵌入?

Python Pandas获取层次路径直到顶层管理

Django admin Csrf令牌未设置

网格基于1.Y轴与2.x轴显示在matplotlib中

具有相同图例 colored颜色 和标签的堆叠子图

使用__json__的 pyramid 在客户端返回意外格式

使用嵌套对象字段的Qdrant过滤

合并相似列表

Polars定制函数返回多列

对于数组中的所有元素,Pandas SELECT行都具有值

使用美汤对维基百科表格进行网络刮擦未返回任何内容

按列表分组到新列中