7

Mac/Python のシステム環境設定の省エネルギー設定が原因で画面がオフになっているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

6

迅速で汚い解決策:出力を呼び出し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(',')))

私のコンピューターでは、値CurrentPowerState4画面がオンの1ときと画面がオフのときです。

より良い解決策: を使用ctypesして、 から直接その情報を取得しますIOKit

于 2013-01-17T02:55:47.883 に答える
4

私が考えることができる唯一の方法は、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/

これは、著者がページに記載しているラッパーです。マイケル・リンによって書かれました。上記の著者のリンクから投稿したコードは、このコードをより理解しやすくするために書き直したものです。

https://github.com/pudquick/pypmset/blob/master/pypmset.py

于 2013-01-14T01:39:16.690 に答える