【问题标题】:Python subprocess.call() spawning new process for every callPython subprocess.call() 为每次调用生成新进程
【发布时间】:2013-11-23 05:29:38
【问题描述】:

我正在尝试将 .mp4 文件发送到 mp4 标记应用程序。我的问题是,在 Windows 上,每次我调用 subprocess.call()subprocess.Popen() 时都会产生一个新进程。

如果进程已经在运行,我想要的是在现有进程中打开文件...这可能吗,还是取决于被调用的进程如何处理新的进程调用?

这是我所拥有的:

def sendToTagger(self, file):
            msg = "-- " + self.getDateStamp() + "-- Sending " + os.path.basename(file) + " to Tagger...\r\n"
            self.logFile.write(msg)
            print(msg)
            p = subprocess.Popen(['C:\\Program Files (x86)\\Tagger\\Tagger.exe', file], shell=False, stdin=None, stdout=None)

【问题讨论】:

  • Tagger.exe 是否通过其标准输入接受新文件,即它是否有效:echo filename.mp4 | Tagger.exe?如果是这样,那么您可以使用单个进程来处理多个媒体文件。
  • @J.F.Sebastian - 感谢您的回复!昨天我正在使用 MetaX,当我写这篇文章时,它不会通过 stdin 处理文件我现在已经开始使用 AtomicParlsey,现在一切都很好。谢谢!

标签: python subprocess single-instance


【解决方案1】:

它必须生成一个新进程,因为您正在调用不是您的 Python 代码本机的外部命令。但是你可以,如果你希望通过调用 p.wait() 来等待进程完成

【讨论】:

  • 每次都不需要生成一个新进程,例如,子进程可以接受来自其标准输入的新文件。
【解决方案2】:

subprocess.Popen 总是打开一个新进程(这就是它的目的)。您需要确定 Tagger.exe 如何允许另一个程序以编程方式请求它打开一个新文件。在最简单的情况下,您可以简单地通过标准输入与它通信(在这种情况下,您需要将标准输入和可能的标准输出设置为 PIPE)。但是,您的程序可能需要其他一些进程间通信 (IPC) 方法。比如套接字、共享内存等。我不熟悉 Windows 上的方法,但如果 Tagger 是一个图形程序,那么你很有可能需要做一些更复杂的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2012-12-25
    • 2020-03-06
    • 2013-08-11
    相关资源
    最近更新 更多