2017-09-16 49 views
2

我正在寻找使用Python 3.5交互式命令行应用程序的接口。我的想法是,我在Python脚本的开始处开始这个过程,并将其打开。在一个循环中,我打印一个文件路径,然后是一个线返回,到stdin,等待它处理四分之一秒左右,并从stdout读取,直到它到达一个换行符。Python子进程:打印到stdin,读取stdout直到换行,重复

这与subprocesscommunicate功能非常相似,但我正在等待换行而不是等待进程终止。任何人都知道一个相对简单的方法来做到这一点?

编辑:如果可能,最好使用标准库来执行此操作,而不是第三方库,如pexpect

+4

你看过'pexpect'模块吗? –

+0

@JonClements我以前用过SSH。不过,我会研究它。谢谢! –

+0

尚未...使用'pexpect'。这有巨大的复杂性,这就是为什么不能推荐使用标准库的原因。 –

回答

2

您可以对此使用subprocess.Popen。

事情是这样的:

proc = subprocess.Popen(['my-command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

现在proc.stdinproc.stdout是你将数据发送到子标准输入,并从子标准输出读取管道的末端。

由于您只想读取换行符终止的行,因此您可能会解决由缓冲引起的任何问题。缓冲是使用子进程与交互过程进行通信时的一个重要问题。通常I/O是行缓冲的,这意味着如果子进程没有用换行符终止一行,您可能永远不会看到proc.stdout上的任何数据,反之亦然,您可以通过写入proc.stdin - 如果您不以换行符结束。您可以关闭缓冲区,但这并不是那么简单,并且不是平台独立的。

您可能需要解决的另一个问题是,您无法确定子进程是否正在等待输入,或者是否已通过写入和读取管道来发送输出。因此,您可能需要启动第二个线程,以便您可以等待proc.stdout上的输出并同时写入proc.stdin而不会发生死锁,因为两个进程都在管道I/O上阻塞(或者,如果您使用的是Unix支持使用文件句柄选择,使用select来确定哪些管道准备好接收或准备从中读取)。

0

这听起来像是一个事件循环的工作。 subprocess模块在复杂任务下开始显示其应变。

我做这个有扭曲,通过继承如下:

twisted.internet.endpoints.ProcessEndpoint 
twisted.protocols.basic.LineOnlyReceiver 

为Twisted的大部分文件使用套接字作为终点,但它并不难调整过程的代码。

相关问题