Python subprocess.call线程挂起,subprocess.popen没有挂起

时间:2014-04-08 20:55:39

标签: python multithreading python-2.7 subprocess

我试图在Windows 7上使用Sikuli和脚本自动安装特定程序。我需要启动程序安装程序,然后使用Siluki逐步完成其余的安装。我是用Python 2.7做的。

此代码按预期工作,创建一个线程,调用子进程,然后继续主进程:

import subprocess
from threading import Thread

class Installer(Thread):
  def __init__(self):
    Thread.__init__(self)
  def run(self):
    subprocess.Popen(["msiexec", "/i", "c:\path\to\installer.msi"], shell=True)

i = Installer()
i.run()
print "Will show up while installer is running."
print "Other things happen"

i.join()

此代码无法按预期运行。它将启动安装程序,但随后挂起:

import subprocess
from threading import Thread

class Installer(Thread):
  def __init__(self):
    Thread.__init__(self)
  def run(self):
    subprocess.call("msiexec /i c:\path\to\installer.msi")

i = Installer()
i.run()
print "Will not show up while installer is running."
print "Other things happen"

i.join()

我知道subprocess.call会等待进程终止。为什么这会阻止主线程继续?主进程调用后主要是否应继续执行?

为什么行为会有这样的差异?

我刚刚开始使用线程C。

2 个答案:

答案 0 :(得分:0)

首先

您需要将命令行参数添加到install命令以使其成为静默安装。 http://msdn.microsoft.com/en-us/library/aa372024%28v=vs.85%29.aspx 子进程可能会挂起,等待一个永远不会结束的安装进程,因为它正在等待用户输入。

第二

如果这不起作用..你应该使用popen并进行沟通 How to use subprocess popen Python

第三

如果仍然无效,那么您的安装程序会挂在某处,您应该在那里调试基础进程。

答案 1 :(得分:0)

您正在调用i.run(),但您应该调用的是i.start()。 start()在一个单独的线程中调用run(),但直接调用run()将在主线程中执行它。