使用Python安装Windows应用程序后重新启动服务器

时间:2017-03-30 07:55:19

标签: python windows

我正在开发一些Python(版本3.6.1)代码以在Windows 7中安装应用程序。使用的代码是:

winCMD = r'"C:\PowerBuild\setup.exe" /v"/qr /l C:\PowerBuild\TUmsi.log"'
output = subprocess.check_call(winCMD, shell = True)

应用程序已成功安装。问题是它在完成后总是需要重新启动(带有消息的弹出窗口“必须重新启动系统才能使配置更改生效。单击是立即重启,如果计划稍后重启,则单击否。”

我尝试在安装命令中插入参数“/ forcerestart”(source here),但它仍然停止请求重启:

def installApp():
    winCMD = r'"C:\PowerBuild\setup.exe" /v"/qr /forcerestart /l C:\PowerBuild\TUmsi.log"'
    output = subprocess.check_call(winCMD, shell = True)

另一个尝试是创建一个如下所示的跟随命令,虽然由于上一个命令尚未完成(根据我的理解),我意识到它永远不会被调用:

rebootSystem = 'shutdown -t 0 /r /f'
subprocess.Popen(rebootSystem, stdout=subprocess.PIPE, shell=True)

有没有人有这样的问题可以解决它?

1 个答案:

答案 0 :(得分:2)

作为一个丑陋的解决方法,如果你不是时间关键的,但你想强调自动"方面,为什么不

  • 在线程中运行installCMD
  • 等待足够长时间以确保命令已完成
  • 执行关机
像这样:

import threading,time
def installApp():
    winCMD = r'"C:\PowerBuild\setup.exe" /v"/qr /l C:\PowerBuild\TUmsi.log"'
    output = subprocess.check_call(winCMD, shell = True)

t = threading.Thread(target=installApp)
t.start()
time.sleep(1800)  # half-hour should be enough
rebootSystem = 'shutdown -t 0 /r /f'
subprocess.Popen(rebootSystem, stdout=subprocess.PIPE, shell=True)

另一种(更安全的)方法是找出在安装中最后创建的文件,并在这样的循环中监视它的存在:

while not os.path.isfile("somefile"):
     time.sleep(60)
time.sleep(60)  # another minute for safety
# perform the reboot

要保持清洁,您必须使用subprocess.Popen进行安装,将其导出为全局并在主过程中调用terminate(),但是因为您需要打电话给shutdown没必要。

(要干净,我们不会在第一时间做那个黑客攻击)