2013-01-10 13 views

cevap

5

Hızlı ve kirli çözüm: ioreg arayıp çıkışını ayrıştırmak. Ekran kapalıyken ekran üzerinde ve 1 olduğunda bilgisayarım içinde

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 değeri 4 olduğunu.

Daha iyi bir çözüm: IOKit'dan bu bilgileri almak için ctypes kullanın.

+0

Harika, teşekkürler! Btw, Mac'imde "ioreg" çıktısı her ne sebeple kırpılmış ve "CurrentPowerState" i göstermiyordu. Göstermek için 'ioreg' ilk argümanı olarak '-w 0' eklemek zorunda kaldım. –

+0

@ceilingcat Cevabı sadece -w 0' parametresiyle güncelledim. –

3

tek yolu OSX pmset Power Management CML Tool

DESCRIPTION

pmset changes and reads power management settings such as idle sleep timing, wake on administrative 
access, automatic restart on power loss, etc. 

aşağıdaki linke bakınız kullanarak, bu bilgilerin büyük bir sağlayacağı tam olarak aradığınız şeyi gerçekleştirmede size yardımcı olmalıdır.

http://managingamac.blogspot.com/2012/12/power-assertions-in-python.html

ben "tasarrufu ve dokümantasyon" amaçlı bağlantı tarafından sağlanan kodu içerecektir:

#!/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

kod IOPMLib dayanır, iddialarını yapmak fonksiyonlar, güç olaylarını programlayın, termik ölçüm yapın ve daha fazlasını yapın.

biz IOKit Framework geçmesi gerekiyor, Python ile bu işlevleri çağırmak için. Bize Python C veri türlerini işlemek için Amacıyla

http://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/IOKitFundamentals/

biz ctypes adında bir yabancı işlevi arabirimi kullanacağız.

http://python.net/crew/theller/ctypes/

Burada yazar sayfasındaki 's açıklayan sarıcı var; Michael Lynn tarafından yazılmıştır. Yazarın yukarıdaki linkinden yazdığım kod, daha anlaşılır hale getirmek için bu kodun bir tekrarıdır.

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

+0

Takip ettiğimden emin değilim. Bana öyle geliyor ki bu kod OS X'in uyumasına engel oluyor; Benim sorum ise ekranın kapalı olup olmadığını (enerji tasarrufu ayarları vb.) kontrol etmektir. İki konuyla ilgili olsa da, ekranın kapalı olup olmadığını kontrol etmek için bu kodu nasıl kullanacağımı anlayamıyorum. Belki bir şey özlüyorum Biraz daha detaylandırır mısın? –

İlgili konular