如何写入Python子进程的stdin?

发布于 2021-02-02 23:13:05

我正在尝试编写一个Python脚本来启动一个子进程,并将其写入子进程stdin。我还希望能够确定子进程崩溃时要采取的措施。

我试图启动的过程是一个名为的程序nuke,它具有自己的Python内置版本,我希望能够向其提交命令,然后告诉其在命令执行后退出。到目前为止,我已经得出结论,如果我在类似这样的命令提示符下启动Python,然后nuke作为子进程启动,那么我可以在中键入命令nuke,但是我希望能够将其全部放入脚本中,以便Python程序可以启动nuke,然后写入其标准输入(并因此写入其内置版本的Python),并告诉它执行令人讨厌的事情,因此我编写了一个如下所示的脚本nuke:

subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])

然后什么也没有发生,因为nuke正在等待用户输入。我现在将如何写入标准输入?

我这样做是因为我正在运行一个带有nuke该插件的插件,导致它在渲染多个帧时间歇性崩溃。因此,我希望此脚本能够启动nuke,告诉它执行某些操作,然后如果崩溃,请重试。因此,如果有一种方法可以捕获崩溃并且仍然可以,那么那就太好了。

关注者
0
被浏览
67
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    最好使用communicate

    from subprocess import Popen, PIPE, STDOUT
    p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
    stdout_data = p.communicate(input='data_to_write')[0]
    
    

    “更好”,因为此警告:

    请使用communication()而不是.stdin.write,.stdout.read.stderr.read来避免死锁,因为其他任何OS管道缓冲区中的任何一个都会填满并阻塞子进程。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看