当前位置: 首页 > 面试题库 >

重复写入STDIN并读取子进程的STDOUT而不关闭它

邹曦之
2023-03-14
问题内容

我试图在Python中使用子进程,以使外部脚本以类似于服务器的方式打开。外部脚本首先加载模型。完成此操作后,它将通过STDIN接受请求,并将处理后的字符串返回给STDOUT。

到目前为止,我已经尝试过

tokenizer = subprocess.Popen([tokenizer_path, '-l', lang_prefix], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

但是,我不能使用

tokenizer.stdin.write(input_string+'\n')
out = self._tokenizer.stdout.readline()

为了通过子过程重复处理input_strings,无论我使用stdout.read()还是,out都将是空的stdout.readline()。但是,当我tokenizer.stdin.close()在读取STDOUT之前关闭stdin时,它起作用了,但是这关闭了子进程,这不是我想要的,因为在发送另一个请求之前,我必须重新加载整个外部脚本。

有没有办法在不关闭和重新打开的情况下以类似于服务器的方式在python中使用子进程?


问题答案:

感谢这个Answer,我发现必须使用一个从属句柄才能与子进程正确通信:

master, slave = pty.openpty()
tokenizer = subprocess.Popen(script, shell=True stdin=subprocess.PIPE, stdout=slave)
stdin_handle = process.stdin
stdout_handle = os.fdopen(master)

现在,我可以与子流程通信,而无需通过关闭

stdin_handle.write(input)
stdout_handle.readline() #gets the processed input


 类似资料:
  • 问题内容: 我正在为Java编程竞赛编写一些代码。程序的输入是使用stdin给出的,输出是在stdout上给出的。你们如何测试可在stdin / stdout上运行的程序?这就是我的想法: 由于System.in的类型为InputStream,而System.out的类型为PrintStream,因此我使用以下原型在函数中编写了代码: 现在,我想使用junit对此进行测试。我想使用字符串伪造Sys

  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至:

  • 我最近试图在我的Ubuntu网络服务器[1]上使用PHP函数proc_open二进制文件进行通信。我可以建立连接并定义管道STDIN、STDOUT和STDERR。不错。 现在,我正在谈论的是一个交互式计算机代数软件-因此,我希望在第一个命令后保持STDOUT和STDIN都处于活动状态,以便我可以在几行之后以交互式方式使用该应用程序(从web前端直接用户输入)。 然而,事实证明,读取二进制文件(st

  • 我试图与一个进程通信(该进程本身会写入stdin和stdout,以便在终端中与用户交互),并在C中读取它的stdin和写入它的stdout。 因此,我尝试以编程方式替换shell用户。一个methapohrical示例:假设出于某种原因我想在C中使用VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)中读取内容。 起初我认为这可能是一项微不足道的任务,但似乎没有标准的方法<代码>i

  • 问题内容: 我正在尝试编写一个Python脚本来启动一个子进程,并将其写入子进程stdin。我还希望能够确定子进程崩溃时要采取的措施。 我试图启动的过程是一个名为的程序nuke,它具有自己的Python内置版本,我希望能够向其提交命令,然后告诉其在命令执行后退出。到目前为止,我已经得出结论,如果我在类似这样的命令提示符下启动Python,然后作为子进程启动,那么我可以在中键入命令,但是我希望能够将

  • 问题内容: (我是Java新手)我需要启动一个进程并接收2或3个句柄:对于STDIN,STDOUT(和STDERR),因此我可以将输入写入进程并接收其输出,就像命令行管道一样表现(例如“ grep”) 在Python中,可以通过以下代码实现: Java等效项是什么? 到目前为止我已经尝试过 顺便说一句,第一次尝试仅适用于\ n \ n,但不适用于单个\ n(为什么?) 下面的代码有效,但是所有输入