【发布时间】:2015-10-07 09:38:09
【问题描述】:
我正在尝试与 python 脚本中的不同 python 解释器进行通信。我写了一个对象,它应该存储子进程并读/写它的标准输入、标准输出、标准错误。
import subprocess
import fcntl
import os
class Python:
def __init__(self):
self.process = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
fcntl.fcntl(self.process.stdout, fcntl.F_SETFL, os.O_RDONLY | os.O_NONBLOCK)
fcntl.fcntl(self.process.stderr, fcntl.F_SETFL, os.O_RDONLY | os.O_NONBLOCK)
def read(self):
stdout = self.process.stdout.read()
if stdout:
print("stdout:", stdout)
stderr = self.process.stderr.read()
if stderr:
print("stderr:", stderr)
def exec(self, line):
self.process.stdin.write(bytes((line + "\n").encode("ascii")))
self.process.stdin.flush()
在 init 函数中创建子进程并将 stdout、stderr 设置为非阻塞模式。 read 函数现在只是将 stdout、stderr 打印到屏幕上,而 exec 函数将一行写入 python 的 stdin 并刷新它。我使用一个简单的 echo 脚本对此进行了测试:
while True:
print(input())
我能够使用我的 exec 方法,过了一会儿,我使用 read 方法读取了我传递给 exec 方法的行。
我的问题是这不适用于 python 解释器。我试图将所有内容写入其标准输入,但它没有向标准输出、标准错误写入任何内容。
【问题讨论】:
-
您的代码未启动
IDLE。 Barepython启动 Python 解释器。要启动IDLE,您将运行python3 -midlelib或类似的。 IDLE 是一个 GUI 程序,可能没有可用的标准输入、标准输出、标准错误。 -
@J.F.Sebastian 对不起,我的错。我的意思是交互式 python 解释器。
-
这是一个块缓冲问题。传递
-u参数,禁用缓冲。注意:非阻塞 I/O 在这种情况下无济于事,您可以放弃fcntl调用。
标签: python subprocess stdout stdin stderr