我正在开发一些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)
有没有人有这样的问题可以解决它?
答案 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
没必要。
(要干净,我们不会在第一时间做那个黑客攻击)