从python重新启动本地计算机

时间:2011-01-07 18:52:34

标签: python windows winapi shutdown restart

有没有办法让计算机在重启时运行Python程序?通用解决方案很好,但特别是我在Windows上。

4 个答案:

答案 0 :(得分:12)

afaik没有通用的方法。

对于Windows,您需要访问Win32 API。像这样:

  import win32api
  win32api.InitiateSystemShutdown()

win32api模块是pywin32的一部分。

对于linux / os x,我想调用“rebo​​ot”命令是最简单的。

import os
os.system('reboot now')

或类似的东西。

(对于downvoters注意:os.system() 已被弃用。文本是“子进程模块提供更强大的工具来生成新进程并检索其结果;使用该模块更可取使用这个函数。“对于这样的简单情况,如果你对检索结果不感兴趣,也不想在多处理中,os.system()工作得很好。”

答案 1 :(得分:7)

为什么不用子进程调用shutdown命令?

答案 2 :(得分:5)

您可以使用以下命令重新启动Windows系统:os.system("shutdown -t 0 -r -f")

示例:

import os
print "REBOOTING"
os.system("shutdown -t 0 -r -f")

更改-t前面的数字以更改关机前的秒数。

答案 3 :(得分:0)

标准库中没有任何内容可以直接允许您执行此操作,我不知道任何提供跨平台方法的模块,但如果您在Windows上并且不想安装任何东西(比如win32api)然后你可以使用ctypes默认模块并直接与WinAPI交互。

您可以使用ExitWindowsEx()函数重新启动计算机(它与我的其他答案How to shudown a computer using Python几乎相同;但是十六进制值必须更改为重新启动而不是关闭)。

<强>过程:

首先你需要ctypes:

import ctypes

接下来按documentation

中的说明获取user32.dll
  

DLL | USER32.DLL

所以:

user32 = ctypes.WinDLL('user32')

接下来,您需要调用ExitWindowsEx()函数并插入正确的十六进制值:

user32.ExitWindowsEx(0x00000002, 0x00000000)

第一个参数(0x00000002)关闭系统然后重新启动(参见documentation)。

第二个参数(0x00000000)给出了系统记录的原因。可以找到完整列表here

完整代码:

import ctypes
user32 = ctypes.WinDLL('user32')
user32.ExitWindowsEx(0x00000002, 0x00000000)

关于Windows上的os.system()方法:

win32api或ctypes答案都将以静默方式执行。 os.system("shutdown -t 0 -r -f")会留下一条消息,说明&#34;您即将在不到一分钟的时间内退出&#34;在某些情况下这可能是不受欢迎的。

名为shutdown.bat / shutdown.exe / shutdown.cmd的脚本旁边的文件将导致命令shutdown -t 0 -r -f中断,调用该文件而不是系统命令。对于上面描述的wmic.exe也是如此。

作为旁注:我构建了WinUtils(仅限Windows),这简化了一点,但它应该更快(并且不需要Ctypes),因为它是用C构建的

示例:

import WinUtils
WinUtils.Restart(WinUtils.SHTDN_REASON_MINOR_OTHER)