如何查看屏幕是否由於Mac/Python下系統偏好設置中的節能設置而關閉?如何檢查Mac/Python中的屏幕是否關閉?
回答
快速和髒溶液:呼叫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
當屏幕處於關閉狀態。
更好的解決方案:使用直接從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,使斷言哪些功能,安排電力事件,測量熱量等等。
要通過Python中調用這些函數,我們必須經歷由於IOKit框架。
http://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/IOKitFundamentals/
爲了讓我們能夠操縱在Python C數據類型,我們將使用一個名爲ctypes的外國功能界面。
http://python.net/crew/theller/ctypes/
下面是筆者描述頁面上的包裝;由Michael Lynn編寫。我從上面的作者鏈接發佈的代碼是對此代碼的重寫,以使其更易於理解。
我不確定我關注。在我看來,這段代碼阻止OS X進入休眠狀態;而我的問題是如何檢查屏幕是否關閉(由於節能設置等)。雖然這兩個問題是相關的,但我無法確定如何使用此代碼來檢查屏幕是否關閉。也許我錯過了什麼?你能再詳細一點嗎? –
- 1. 檢查時,屏幕關閉
- 2. 如何檢測iPhone屏幕是否鎖定(關閉)
- 3. 如何檢測NSDrawer是否會關閉屏幕
- 4. 檢查當前屏幕在iOS中是打開還是關閉
- 5. Java - 如何檢查JFrame是否關閉
- 6. 如何檢查Dialog是否關閉?
- 7. 如何檢查OutputStream是否關閉
- 8. 如何檢查zipfile是否已關閉
- 9. 如何檢查遊戲是否關閉?
- 10. 如何檢查QWidget是否關閉?
- 11. 檢查UIBezierPath是否關閉
- 12. 檢測iOS UICollectionCell何時關閉屏幕
- 13. 屏幕關閉時是否可以檢測到運動?
- 14. 關閉屏幕
- 15. 如何檢查iOS11屏幕錄製打開或關閉?
- 16. 如何檢查Android中的屏幕是否真的可見?
- 17. 如何檢查窗口是否在Tkinter的全屏幕中?
- 18. 如何在windows phone中關閉屏幕?
- 19. 如何檢查Android設備是HDPI屏幕還是MDPI屏幕?
- 20. 如何檢測屏幕是否開啓/關閉科爾多瓦android
- 21. 如何檢測屏幕是否連接?
- 22. OSX:檢查屏幕是否鎖定
- 23. 咖啡 - 檢查屏幕是否可見
- 24. 檢查控制是否在屏幕上
- 25. 檢查屏幕是否已解鎖
- 26. 檢查屏幕上是否顯示Vector3
- 27. 檢測屏幕是關閉還是在服務中
- 28. Ionic:如何檢查它是否是第一個屏幕
- 29. 而屏幕關閉
- 30. Android關閉屏幕
太棒了,謝謝!順便說一句,在我的Mac上,'ioreg'的輸出會因爲任何原因被剪切掉,並且不會顯示'CurrentPowerState'。我必須添加'-w 0'作爲'ioreg'的第一個參數來顯示它。 –
@ceilingcat我剛剛用'-w 0'參數更新了答案。 –