问题 如何使用Python关闭计算机


我写了一个Python脚本,最终应该关闭计算机。

这一行是其中的一部分:

os.system("shutdown /p")

它会进行某种关闭,但仍保留在开启的Windows控制面板上(用户可以切换计算机用户)。

有没有办法完全关闭电脑?

我试过其他的 os.system("shutdown ___") 方法没有成功。

还有其他方法可能会有所帮助吗?


3552
2017-12-02 10:02


起源

这与Python没有任何关系,因为 shutdown /p 只是作为终端命令发送到系统。请指定您的操作系统版本,因为选项可能会有所不同。 - TigerhawkT3
当然是。但我的问题是,是否有使用Python模块的方法呢?或另一种方式?我需要在几台计算机上运行该程序,因此操作系统版本不一样。谢谢 - Ben L


答案:


import os
os.system('shutdown -s')

这对你有用。


11
2017-12-02 18:55



这样做的一个问题是它留下了一条信息 "You are about to be signed out in less than a minute"。另一个是如果有人放置一个带有名称的批处理脚本 shutdown.bat 使用该脚本它将无法工作,因为该文件将被执行,这也是一个安全隐患。 子 现在应该用完了 os.system()。 - Simon
你可以避免那条消息 - os.system('shutdown -s -t 0') - Sharpowski


对于Linux:

import os
os.system('sudo shutdown now')

或者:如果你想立即关机而没有 sudo 提示密码,使用以下Ubuntu和类似的发行版:

os.system('systemctl poweroff') 

5
2017-12-14 22:31



子 现在应该用完了 os.system()。 - Simon


运用 ctypes的 你可以使用 ExitWindowsEx 关闭计算机的功能。

MSDN的说明:

注销交互式用户,关闭系统或关闭并重新启动系统。


首先是一些代码:

import ctypes

user32 = ctypes.WinDLL('user32')

user32.ExitWindowsEx(0x00000008, 0x00000000)

现在逐行解释:

  • 获取ctypes库
  • ExitWindowsEx 是由提供 user32.dll 并需要通过加载 WinDLL()
  • 打电话给 ExitWindowsEx() 功能并传递必要的参数。

参数:

所有参数都是十六进制。

我选择的第一个参数:

关闭系统并关闭电源。系统必须支持断电功能。

还有许多其他可能的功能 文件 获取完整清单。

第二个论点:

第二个论点 必须 给出系统记录的关闭原因。在这种情况下,我将其设置为 Other issue 但有很多可供选择。看到 这个 获取完整清单。

跨平台:

这可以与其他方法结合使其跨平台。例如:

import sys

if sys.platform == 'win32':

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

else:

    import os
    os.system('sudo shutdown now')

这是Windows依赖的功能(虽然Linux / Mac将具有相同的功能),但是比调用更好的解决方案 os.system() 自从调用批处理脚本 shutdown.bat 不会与命令冲突(并在此期间造成安全隐患)。

此外,它不会打扰用户的消息说 "You are about to be signed out in less than a minute" 喜欢 shutdown -s 确实如此,但是默默地执行。

作为旁注使用  过度 os.system() (看到 subprocess.Popen和os.system之间的区别


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

例:

import WinUtils
WinUtils.Shutdown(WinUtils.SHTDN_REASON_MINOR_OTHER)

0
2018-06-12 19:47