Mac/Python のシステム環境設定の省エネルギー設定が原因で画面がオフになっているかどうかを確認するにはどうすればよいですか?
2 に答える
迅速で汚い解決策:出力を呼び出しioreg
て解析します。
import subprocess
import re
POWER_MGMT_RE = re.compile(r'IOPowerManagement.*{(.*)}')
def display_status():
output = subprocess.check_output(
'ioreg -w 0 -c IODisplayWrangler -r IODisplayWrangler'.split())
status = POWER_MGMT_RE.search(output).group(1)
return dict((k[1:-1], v) for (k, v) in (x.split('=') for x in
status.split(',')))
私のコンピューターでは、値CurrentPowerState
は4
画面がオンの1
ときと画面がオフのときです。
より良い解決策: を使用ctypes
して、 から直接その情報を取得しますIOKit
。
私が考えることができる唯一の方法は、OSX pmset Power Management CML Toolを使用することです
説明
pmset changes and reads power management settings such as idle sleep timing, wake on administrative access, automatic restart on power loss, etc.
次のリンクを参照してください。探しているものを正確に達成するのに役立つ大量の情報が提供されます。
http://managingamac.blogspot.com/2012/12/power-assertions-in-python.html
「保存と文書化」の目的で、リンクによって提供されるコードを含めます。
#!/usr/bin/python
import ctypes
import CoreFoundation
import objc
import subprocess
import time
def SetUpIOFramework():
# load the IOKit library
framework = ctypes.cdll.LoadLibrary(
'/System/Library/Frameworks/IOKit.framework/IOKit')
# declare parameters as described in IOPMLib.h
framework.IOPMAssertionCreateWithName.argtypes = [
ctypes.c_void_p, # CFStringRef
ctypes.c_uint32, # IOPMAssertionLevel
ctypes.c_void_p, # CFStringRef
ctypes.POINTER(ctypes.c_uint32)] # IOPMAssertionID
framework.IOPMAssertionRelease.argtypes = [
ctypes.c_uint32] # IOPMAssertionID
return framework
def StringToCFString(string):
# we'll need to convert our strings before use
return objc.pyobjc_id(
CoreFoundation.CFStringCreateWithCString(
None, string,
CoreFoundation.kCFStringEncodingASCII).nsstring())
def AssertionCreateWithName(framework, a_type,
a_level, a_reason):
# this method will create an assertion using the IOKit library
# several parameters
a_id = ctypes.c_uint32(0)
a_type = StringToCFString(a_type)
a_reason = StringToCFString(a_reason)
a_error = framework.IOPMAssertionCreateWithName(
a_type, a_level, a_reason, ctypes.byref(a_id))
# we get back a 0 or stderr, along with a unique c_uint
# representing the assertion ID so we can release it later
return a_error, a_id
def AssertionRelease(framework, assertion_id):
# releasing the assertion is easy, and also returns a 0 on
# success, or stderr otherwise
return framework.IOPMAssertionRelease(assertion_id)
def main():
# let's create a no idle assertion for 30 seconds
no_idle = 'NoIdleSleepAssertion'
reason = 'Test of Pythonic power assertions'
# first, we'll need the IOKit framework
framework = SetUpIOFramework()
# next, create the assertion and save the ID!
ret, a_id = AssertionCreateWithName(framework, no_idle, 255, reason)
print '\n\nCreating power assertion: status %s, id %s\n\n' % (ret, a_id)
# subprocess a call to pmset to verify the assertion worked
subprocess.call(['pmset', '-g', 'assertions'])
time.sleep(5)
# finally, release the assertion of the ID we saved earlier
AssertionRelease(framework, a_id)
print '\n\nReleasing power assertion: id %s\n\n' % a_id
# verify the assertion has been removed
subprocess.call(['pmset', '-g', 'assertions'])
if __name__ == '__main__':
main()
http://opensource.apple.com/source/PowerManagement/PowerManagement-211/pmset/pmset.c
このコードは、アサーションの作成、電源イベントのスケジュール設定、温度測定などの機能を果たす IOPMLib に依存しています。
https://developer.apple.com/library/mac/#documentation/IOKit/Reference/IOPMLib_header_reference/
これらの関数を Python から呼び出すには、IOKit フレームワークを経由する必要があります。
http://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/IOKitFundamentals/
Python で C データ型を操作するために、ctypes と呼ばれる外部関数インターフェイスを使用します。
http://python.net/crew/theller/ctypes/
これは、著者がページに記載しているラッパーです。マイケル・リンによって書かれました。上記の著者のリンクから投稿したコードは、このコードをより理解しやすくするために書き直したものです。