【问题标题】:popen sending command topopen 发送命令到
【发布时间】:2012-08-22 04:04:36
【问题描述】:

我正在尝试从程序 X 打开程序 Y,并继续使用程序 X,但是,似乎一旦使用命令行调用了 Y,它就会开始跳过代码中接下来的任何内容,而仍然响应击键。

所以问题是,如何让 X 完成代码。

我用:

 proc=subprocess.Popen([cmd], shell=True)
 proc.communicate()

还有:

 os.system([cmd])

其中 cmd 是带有参数的终端命令。

顺便说一句,我正在运行 Linux。

【问题讨论】:

  • 我很困惑:首先你说 Y 被 X 调用(即以编程方式),然后你提到从命令行调用它。你真的是指“X”吗?

标签: python linux operating-system popen


【解决方案1】:

两种方式(Popen+communicate()os.system)都是同步的,因此父进程的执行会一直阻塞,直到子进程完成。

如果你想让两个进程同时运行,你必须想出一种不同的方式来收集子进程的输出。

一些想法:

  1. 在父进程的线程内移动代码(参见threading

  2. 剥离proc.communicate() 并以不同于stdout pipes 的方式收集子输出。有关更多想法,请参阅multiprocessing 模块。或者,如果您觉得勇敢,请查看 ZeroMQ(可能有点矫枉过正,请注意,我只是认为这是一个很棒的交流库)。

【讨论】:

  • 嘿,我只是想我应该只使用 2.4 编译器版本,考虑到这一点,你认为你提到的那些方法仍然有效吗?
  • 哇! 2.4 版真的已经过时了(快 4 年了)。 multiprocessing 模块是在 2.6 中引入的。至于 ZeroMQ 我不知道,但我认为它并不适合你的情况。 threading 模块可能是您最好的选择。