Python Subprocess:打印到STDIN,阅读Stdout直到Newline,重复



我希望使用Python 3.5与交互式命令行应用程序进行连接。这个想法是我在Python脚本的开头开始过程,然后打开它。在一个循环中,我打印一个文件路径,然后打印一条线返回,到stdin,在处理时等待四分之一秒左右,然后从stdout读取直到到达newline。

这与subprocesscommunicate功能非常相似,但是我正在等待线路返回而不是等待该过程终止。任何人都知道这样做的相对简单的方法?

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

您可以使用subprocess.popen为此。

类似的东西:

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

现在proc.stdinproc.stdout是您的管道端,它们将数据发送到Subprocess Stdin并从子过程中读取。

由于您只对阅读Newline终止的线路有兴趣,因此您可能会解决由于缓冲而引起的任何问题。缓冲是使用子进程与交互式过程进行交流的大陷阱之一。通常I/O是延误的,这意味着,如果子过程未与Newline终止一条线,您可能永远不会在proc.stdout上看到任何数据,反之亦然,您可以写信给proc.stdin-如果您可能看不到它不以Newline结尾。您可以关闭缓冲,但这并不是那么简单,也不是独立的平台。

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

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

我通过twisted进行了以下内容,以下操作:

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

大多数扭曲的文档用作终点,但不难调整进程的代码。

最新更新