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

如何写入Python子进程的stdin?

蒋骏
2023-03-14
问题内容

我正在尝试编写一个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,告诉它执行某些操作,然后如果崩溃,请重试。因此,如果有一种方法可以捕获崩溃并且仍然可以,那么那就太好了。


问题答案:

最好使用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管道缓冲区中的任何一个都会填满并阻塞子进程。



 类似资料:
  • 问题内容: 感谢以下有用的建议: 所以当我似乎固定 将命令分成对Popen的单独调用 stderr = subprocess.PIPE作为每个Popen链的参数。 新代码: 原始帖子: 我花了很长时间尝试解决通过简单的subprocess.Popen传递问题。 码: 输出文件的长度约为1000行: 文件长度大于241行的输出: 文件长度小于241行的输出很好。 我一直在疯狂地阅读文档并进行谷歌搜索

  • 问题内容: 例如从bash: 仅杀死父进程。 问题答案: 当您将 负 PID传递给时,它实际上会通过该(绝对)数字将信号发送到过程 组 。您可以在Python中完成与之等效的操作。

  • 问题内容: 如何写入subprocess.Popen对象的文件描述符3? 我正在尝试使用Python(不使用命名管道)在以下shell命令中完成重定向: 问题答案: 子进程继承在父进程中打开的文件描述符。因此,您可以用来打开passphrase.txt并获取其关联的文件描述符。然后,您可以构造一个使用该文件描述符的命令: 要从管道而不是文件中读取数据,可以使用:

  • 问题内容: 我正在尝试使用节点生成一个外部进程,然后在初始化之后将信息发送给该进程,这可能吗? 我有以下代码: 但是,我在stdout上获得的唯一信息是phantomjs控制台的初始提示。 因此,似乎没有任何效果。 我不确定我是否可以在初始生成时向phantomjs发送其他信息。 提前致谢。 问题答案: 您还需要传递符号以使命令生效:

  • 问题内容: 我在Python中使用子进程包运行一个子进程,以后需要杀死它。但是,子流程包的文档指出,terminate()函数仅从2.6起可用。 我们正在运行带有2.5的Linux,并且出于向后兼容的原因,我无法升级到2.6,替代品是什么?我猜这些功能是某些事情的便捷方法。 问题答案: 您在进程pid上调用os.kill。 您还可以,因为您使用的是Linux。Windows用户很不走运。

  • 问题内容: 如何在Windows上的Python中等待多个子进程,而无需主动等待(轮询)?这样的事情 几乎 对我有用: 问题是,当之前完成时,父进程仍将等待。在Unix上,人们会在循环中使用它们来获取子进程的返回代码,这些代码在完成时如何在Windows上的Python中实现类似功能? 问题答案: 可能看起来有些矫kill过正,但是,在这里: