【问题标题】:Calling multiple sub-processes sequentially顺序调用多个子流程
【发布时间】:2015-01-05 16:26:50
【问题描述】:

我需要能够每隔几毫秒调用一次 bash 命令,并且我正在尝试使用子进程来执行此操作。我目前使用:

p = subprocess.Popen(command, universal_newlines=True, cwd=CurrentWorkingDirectory ,shell=True, stdout=subprocess.PIPE)

并有一个计时器在需要的时间触发命令。

我的问题是,如果我通过使用subprocess.Popen 调用这些命令,这会打开新终端来运行每个命令吗?我想确保我不会遇到任何内存使用问题,因为我将调用数千个这样的命令。

最好的方法是什么?

【问题讨论】:

  • 您是否曾经在执行此操作时真的耗尽了内存?
  • 你为什么要开设新的终端?
  • 我还不能对此进行测试,但我将从每个命令运行一个驱动程序。我不确定每次后续调用“subprocess.Popen”是否会打开一个新终端,因为它在后台运行......我想知道它们是否会堆积起来,或者有什么最终会适得其反这个。
  • @TWagner:如果您运行一个命令(不是每 60 毫秒一个),是否会打开一个新终端?如果你运行两个顺序命令怎么办?这不能轻易测试吗?
  • 是否打开新终端完全取决于command 是什么。如果是xterm,那么,是的,您将打开一个新终端。如果是df,它应该只是附加到您当前的终端...

标签: python bash out-of-memory subprocess popen


【解决方案1】:

无论您做什么,无论是否内存不足,都有比在一分钟内启动一千个进程更好的选择。

要按顺序运行子进程,请使用subprocess.check_call 而不是subprocess.Popen

这会打开新的终端来运行每个命令吗?

不,除非命令本身启动一个新终端。

【讨论】:

  • 好的,谢谢,我会试试 check_call。虽然这会等待命令完成吗?在生成这些外部程序时,我需要程序继续运行...
  • 点击链接。它导致文档。使用专用线程生成子进程以避免阻塞程序的其余部分
【解决方案2】:

要回答您关于终端打开的问题,除非底层 bash 脚本明确启动终端选项卡或其他内容,否则不会发生这种情况。至于您关于内存使用的问题,这将完全取决于您正在调用的底层脚本以及您是以顺序还是并发方式执行它。我想稍微澄清一下可能会有所帮助!

【讨论】:

  • 所以我只是运行一个需要通过终端运行的驱动程序,使用 [python3 'program' blah blah blah]....作为命令...所以它将是顺序调用“subprocess.Popen” 几乎每秒 17 次,最多会持续几分钟。所以每 60 毫秒我的程序将使用 subprocess.Popen(newCommand)
  • 如果是这种情况,那么它完全取决于您正在启动的驱动程序进程的 CPU 和内存使用情况。 Python 对程序没有自己的内存限制,所以如果这个气球会继续运行,直到耗尽系统的限制
  • 好的,有没有办法将顺序命令发送到在后台运行的同一个终端窗口?或者这些打开的终端在完成程序后会退出吗?
  • 从上面的 cmets 也可以看出,“进程”和“终端”之间存在混淆。终端是您在命令行上实际输入命令的东西。 Popen 将在一个新进程中启动一个新的子程序。它与终端窗口无关。 Popen 是一个非阻塞调用。如果您想按顺序执行此操作,我建议您改用callcheck_output。更多信息:docs.python.org/2/library/subprocess.html#subprocess.Popen
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多