使用python关闭计算机(linux)

use*_*859 15 python linux system-shutdown python-2.7

我正在尝试编写一个脚本,如果命令填充了一些要求,将关闭计算机

    os.system("poweroff")
Run Code Online (Sandbox Code Playgroud)

也试过了

    os.system("shutdown now -h")
Run Code Online (Sandbox Code Playgroud)

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

如何在python中关闭计算机?

编辑:

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

Rah*_*obi 20

import os
os.system("shutdown now -h")
Run Code Online (Sandbox Code Playgroud)

使用root权限执行脚本.

  • os.system("sudo shutdown now -h")#worked for me ;-) (3认同)

Bor*_*jaX 20

许多Linux发行版在那里需要超级用户权限执行shutdown或者halt,不过呢,怎么来,如果你坐在你的电脑上,你可以将其关闭而不根?嗯......这背后的想法是,如果你有物理访问计算机,你几乎可以拉电源线并关闭电源,所以现在,许多发行版允许关闭电源虽然访问本地系统总线可访问通过root.问题dbus(或通过它暴露的服务,而不是)?它在不断变化.我建议安装一个dbus查看器工具,如D-feet(建议:它仍然很难想象,但它可能有帮助)

看看这些Dbus关机脚本.

如果您的发布中仍有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()
Run Code Online (Sandbox Code Playgroud)

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

您可能必须安装该dbus软件包才能工作(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()
Run Code Online (Sandbox Code Playgroud)

更新2:

可能为什么你能做到这一点而不dbus-python值得更广泛的解释.让我们专注于更新的root(ConsoleKit更复杂和混乱,恕我直言).

HAL是一个ConsoleKit在您的系统中运行的服务:

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
Run Code Online (Sandbox Code Playgroud)

现在,root它只是一个消息传递系统.您有一个服务,例如公开接口的ConsoleKitd-bus.暴露的方法之一是d-bus(如上所示).使用PolKit控制ConsoleKit的权限,尽管它基于常规的Linux权限,但它为"谁可以做什么"提供了更好的控制.例如,PolKit可以说"如果用户登录到计算机,然后允许他做某事.如果它是远程连接的,那么就不要." .如果PolKit确定允许您的用户调用ConsoleKit的方法,那么该请求将通过(或通过)传递给ConsoleKit(随后它将关闭您的计算机,因为它可以...因为它值得...因为它是)StopStopd-bus

进一步阅读:

总结一下:如果没有,你就无法关闭电脑root.但是,您可以告诉正在运行的服务,root以便为您关闭系统.

奖金:

我在你的意见,你想关闭计算机耗时的任务,以防止过热一段时间后一个读......你知道吗,你可以很可能在使用RTC指定时间接通电源?(看到这个这个)很酷,呃?(当我发现我能做到这一点时,我非常兴奋...):- D

  • @black:再来一次?*熟悉*因为不太严重?如果是这样,那么是的.编程很有趣!令人兴奋!!! 而且很酷**: - )** (3认同)

Sus*_* Pv 6

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

import os
os.system('systemctl poweroff') 
Run Code Online (Sandbox Code Playgroud)