使用python关闭计算机(linux)

时间:2014-04-11 12:58:45

标签: python linux python-2.7 system-shutdown

我正在尝试编写一个脚本,如果使用命令

填充了一些要求,将关闭计算机
    os.system("poweroff")

也尝试了

    os.system("shutdown now -h")

和其他一些人。但是当我运行它时没有任何反应,计算机通过代码而不会崩溃或产生任何错误消息并正常终止脚本,而无需关闭计算机。

如何在python中关闭计算机?

编辑:

似乎我尝试过的命令需要root访问权限。有没有办法在没有提升权限的情况下从脚本关闭机器?

8 个答案:

答案 0 :(得分:20)

import os
os.system("shutdown now -h")

使用root权限执行脚本。

答案 1 :(得分:19)

许多Linux发行版都需要超级用户权限才能执行shutdownhalt,但是,如果你坐在计算机上,你可以在没有它的情况下关闭它是根?你打开一个菜单,点击 Shutdown 并关闭它而不会成为root,对吗?

嗯......这背后的理由是如果你有物理访问电脑的话,你几乎可以拔掉电源线并将其关闭,所以现在很多发行版都允许电源-off虽然访问通过dbus可访问的本地系统总线。问题dbus(或通过它暴露的服务,而不是)?它在不断变化。我建议安装一个dbus查看器工具,例如D-feet(请注意:它仍然很难想象,但它可能会有所帮助)

看看these Dbus shutdown scripts

如果您的发行版中仍有HAL(即将被弃用)请尝试以下方法:

import dbus
sys_bus = dbus.SystemBus()
hal_srvc = sys_bus.get_object('org.freedesktop.Hal',
                              '/org/freedesktop/Hal/devices/computer')
pwr_mgmt =  dbus.Interface(hal_srvc,
                'org.freedesktop.Hal.Device.SystemPowerManagement')
shutdown_method = pwr_mgmt.get_dbus_method("Shutdown")
shutdown_method()

这适用于Ubuntu 12.04(我刚刚关闭计算机以确保其正常工作)。如果你有更新的东西......好吧,它可能不起作用。这是该方法的缺点:它具有特定的分布特性。

您可能必须安装dbus-python包才能使其正常工作(http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html

更新1:

我一直在进行一些研究,看起来这是通过ConsoleKit在较新的Ubuntu版本中完成的。我已经在我的Ubuntu 12.04(已经弃用的HAL和更新的ConsoleKit)中测试了下面的代码,它确实关闭了我的电脑:

>>> import dbus
>>> sys_bus = dbus.SystemBus()
>>> ck_srv = sys_bus.get_object('org.freedesktop.ConsoleKit',
                                '/org/freedesktop/ConsoleKit/Manager')
>>> ck_iface = dbus.Interface(ck_srv, 'org.freedesktop.ConsoleKit.Manager')
>>> stop_method = ck_iface.get_dbus_method("Stop")
>>> stop_method()

更新2:

可能为什么你能做到这一点而不是root值得更广泛的解释。让我们专注于较新的ConsoleKitHAL更加复杂和混乱,恕我直言。)

ConsoleKit是系统中运行为root的服务:

borrajax@borrajax:/tmp$ ps aux|grep console-kit
root 1590  0.0  0.0 1043056 3876 ? Sl   Dec05   0:00 /usr/sbin/console-kit-daemon --no-daemon

现在,d-bus只是一个消息传递系统。您有一个服务,例如 ConsoleKit ,它将接口公开给d-bus。暴露的方法之一是Stop(如上所示)。 ConsoleKit 的权限由 PolKit 控制,它(尽管基于常规的Linux权限)为提供了更精细的控制。 &#34;谁可以做什么&#34; 。例如, PolKit 可以说&#34;如果用户登录到计算机,则允许他做某事。如果它是远程连接的,则不要。&#34; 。如果 PolKit 确定允许您的用户调用 ConsoleKit Stop方法,则该请求将通过(或通过< / em>)d-bus ConsoleKit (随后它将关闭您的计算机,因为它可以...因为它值得......因为它是{{em> {{ 1}})

进一步阅读:

总结一下:您无法在root之前关闭计算机。但您可以告诉正在运行root的服务为您关闭系统。

BONUS

我在你的一条评论中读到,你想在耗时的任务之后关闭电脑,以防止它过热......你知道吗可能可能给它打开电源使用RTC的时间? (见thisthis)非常酷,呃? (当我发现我能做到这一点时,我非常兴奋......): - D

答案 2 :(得分:6)

关闭系统的最佳方法是使用以下代码

import os
os.system('systemctl poweroff') 

答案 3 :(得分:2)

  

任何方式关闭......没有提升权限?

不,没有(幸运的是!)。

请注意,您可以使用多种系统功能为普通用户更轻松地进行权限提升:

答案 4 :(得分:2)

只是为了使用logind(较新的fedora系统)添加@BorrajaX的答案:

import dbus
sys_bus = dbus.SystemBus()
lg = sys_bus.get_object('org.freedesktop.login1','/org/freedesktop/login1')
pwr_mgmt =  dbus.Interface(lg,'org.freedesktop.login1.Manager')
shutdown_method = pwr_mgmt.get_dbus_method("PowerOff")
shutdown_method(True)

答案 5 :(得分:0)

linux:

import subprocess
cmdCommand = "shutdown -h now"
process = subprocess.Popen(cmdCommand.split(), stdout=subprocess.PIPE)

Windows:

import subprocess
cmdCommand = "shutdown -s"
process = subprocess.Popen(cmdCommand.split(), stdout=subprocess.PIPE)

答案 6 :(得分:0)

如果您想从根目录执行它,@Rahul R Dhobi答案非常有用:
import os
os.system("shutdown now -h")

执行: sudo python_script.py


如果您需要在没有root特权的情况下执行它:
import subprocess
import shlex
cmd = shlex.split("sudo shutdown -h now")
subprocess.call(cmd)

执行: $ python_script.py # no sudo required

答案 7 :(得分:-1)

我正在使用Fedora,它与我合作。我需要做的就是在终端写这一行:

$ sudo python  yourScript.py