核心要點
dir()
函數和pyobjc文檔,可以導航macOS API並執行任何可以用Objective-C完成的任務。 本文節選自《實用Python》,Stuart探討了使用Python控制Windows操作系統的方法。
在Mac上工作時,我們可以使用pyobjc(Python到Objective-C的橋接)來控制系統幾乎所有方面。 Apple通過AppKit模塊使大多數操作系統可控,而pyobjc使Python可以訪問所有這些功能。如果我們已經知道使用AppKit的方法來完成我們想要做的事情,那麼這將非常有用,但只需稍加探索,就可以遍歷操作系統API。
讓我們嘗試一個示例。首先,我們需要pyobjc,可以使用pip install pyobjc
安裝。這將安裝整個操作系統API橋接列表,允許訪問macOS的各種方面。目前,我們將考慮AppKit,它是用於構建和控制Mac桌面上的正在運行的應用程序的工具。
我們可以使用AppKit列出當前正在運行的所有應用程序:
>>> from AppKit import NSWorkspace >>> NSWorkspace.sharedWorkspace().runningApplications() ( "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", ) >>>
這將提供一個很長的NSRunningApplication對象列表。每個對像都對應於當前在桌面上運行的特定應用程序。許多是“不可見”的應用程序(正在運行但並非一定顯示窗口的應用程序),但其他一些是我們可能認為是實際應用程序的應用程序——例如Safari、Terminal等等。 NSRunningApplication在developer.apple.com上有文檔記錄,可以在其中查看其屬性。例如,每個應用程序都有一個localizedName
和一個bundleIdentifier
:
>>> for nsapp in NSWorkspace.sharedWorkspace().runningApplications(): ... print(f"{nsapp.localizedName()} -> {nsapp.bundleIdentifier()}") ... loginwindow -> com.apple.loginwindow BackgroundTaskManagementAgent -> com.apple.backgroundtaskmanagement.agent WindowManager -> com.apple.WindowManager CoreLocationAgent -> com.apple.CoreLocationAgent Terminal -> com.apple.Terminal Safari -> com.apple.Safari Spotlight -> com.apple.Spotlight Finder -> com.apple.finder
我們還可以看到NSRunningApplication對像有一個activate
函數,我們可以調用它來激活該應用程序,就像我們單擊Dock中的圖標一樣。因此,要查找Safari然後激活它,我們將使用該activate
函數。對activate
的調用需要options
的值,如文檔所述,這也需要從AppKit導入:
>>> from AppKit import NSWorkspace, NSApplicationActivateIgnoringOtherApps >>> safari_list = [x for x in NSWorkspace.sharedWorkspace().runningApplications() ... if x.bundleIdentifier() == 'com.apple.Safari'] >>> safari = safari_list[0] >>> safari.activateWithOptions_(NSApplicationActivateIgnoringOtherApps)
現在Safari已激活。
查找macOS API的Python版本
查找與Objective-C名稱對應的Python名稱可能有點棘手。如上面的代碼所示,Objective-C的activate
函數在Python中稱為activateWithOptions_
。有一套關於此名稱轉換的規則,pyobjc文檔對此進行了說明,但有時使用Python自己的dir()
函數來顯示對象的全部屬性,然後選擇看起來最合理的屬性會更快:
>>> from AppKit import NSWorkspace >>> NSWorkspace.sharedWorkspace().runningApplications() ( "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", "<nsrunningapplication: lsasn:="">", ) >>>
哎呀!我們的safari(NSRunningApplication實例)有452個屬性!好吧,我們想要的那個可能被稱為類似“activate”的東西,所以:
>>> for nsapp in NSWorkspace.sharedWorkspace().runningApplications(): ... print(f"{nsapp.localizedName()} -> {nsapp.bundleIdentifier()}") ... loginwindow -> com.apple.loginwindow BackgroundTaskManagementAgent -> com.apple.backgroundtaskmanagement.agent WindowManager -> com.apple.WindowManager CoreLocationAgent -> com.apple.CoreLocationAgent Terminal -> com.apple.Terminal Safari -> com.apple.Safari Spotlight -> com.apple.Spotlight Finder -> com.apple.finder
啊哈!所以activateWithOptions_
是我們需要調用的函數的名稱。類似地,我們要傳遞給該函數的選項的名稱在AppKit本身中:
>>> from AppKit import NSWorkspace, NSApplicationActivateIgnoringOtherApps >>> safari_list = [x for x in NSWorkspace.sharedWorkspace().runningApplications() ... if x.bundleIdentifier() == 'com.apple.Safari'] >>> safari = safari_list[0] >>> safari.activateWithOptions_(NSApplicationActivateIgnoringOtherApps)
這個過程有時會感覺有點探索性,但是也可以從Python執行Objective-C可以執行的任何操作。
本文節選自《實用Python》,可在SitePoint Premium和電子書零售商處購買。
關於使用Python控制MacOS的常見問題解答(FAQ)
AppKit是macOS SDK中的一個框架,其中包含在macOS應用程序中實現圖形化、事件驅動的用戶界面所需的所有對象。它提供廣泛的類和函數,用於創建和管理應用程序窗口、處理用戶輸入、繪製圖形以及執行與用戶界面相關的其他任務。在Python中,您可以使用PyObjC橋接來訪問AppKit和其他Objective-C框架。這允許您編寫可以控制macOS應用程序、操作窗口和與系統服務交互的Python腳本。
PyObjC是一個Python到Objective-C的橋接,允許您使用Python編寫功能齊全的macOS應用程序。您可以使用Python包安裝程序pip來安裝它。打開終端窗口並鍵入以下命令:pip install pyobjc
。這將下載並安裝PyObjC模塊及其依賴項。安裝完成後,您可以使用import objc
在Python腳本中導入該模塊。
此錯誤通常表示AppKit模塊未安裝或在您的Python環境中找不到。首先,確保您已安裝PyObjC模塊(其中包括AppKit)。如果您已安裝PyObjC但仍然收到此錯誤,則您可能正在使用未安裝PyObjC的不同Python環境。在這種情況下,您需要在正確的Python環境中安裝PyObjC,或切換到已安裝PyObjC的Python環境。
使用PyObjC橋接,您可以使用Python通過發送AppleScript命令或使用腳本橋來控制macOS應用程序。例如,您可以啟動應用程序、操作窗口、發送擊鍵並執行其他任務。這需要很好地理解Python和AppleScript,以及應用程序的腳本接口。
AppKit框架提供了一些用於處理窗口的類,例如NSWindow
和NSApplication
。您可以使用這些類來獲取所有打開窗口的列表,將窗口置於最前面,調整窗口大小或移動窗口,以及執行其他與窗口相關的任務。這需要使用PyObjC橋接從Python訪問AppKit類。
是的,您可以使用Python和PyObjC橋接與macOS中的各種系統服務交互。例如,您可以使用NSWorkspace
類打開URL、啟動應用程序以及執行與用戶的workspace相關的其他任務。您還可以使用NSNotificationCenter
類來發布和觀察通知,這允許您的腳本響應系統事件。
您可以使用AppKit框架的NSEvent
類來創建和發布鍵盤事件,這實際上允許您從Python腳本發送擊鍵。這需要很好地理解NSEvent
類和鍵盤事件類型,以及您要按下的鍵的鍵碼。
是的,AppKit框架提供了一些用於繪製圖形的類,例如NSGraphicsContext
、NSBezierPath
和NSColor
。您可以使用這些類來繪製線條、形狀和圖像,設置繪圖顏色以及執行其他繪圖任務。這需要使用PyObjC橋接從Python訪問AppKit類。
AppKit框架提供了一些用於處理用戶輸入的類,例如NSEvent
和NSResponder
。您可以使用這些類來獲取鼠標事件、鍵盤事件和其他類型的用戶輸入。這需要使用PyObjC橋接從Python訪問AppKit類。
是的,使用PyObjC橋接,您可以使用Python編寫功能齊全的macOS應用程序。這包括使用窗口、按鈕和其他控件創建圖形用戶界面、處理用戶輸入、繪製圖形以及與系統服務交互。但是,這需要很好地理解Python和macOS SDK,以及AppKit框架和其他Objective-C框架。
以上是快速提示:用Python控制MacOS的詳細內容。更多資訊請關注PHP中文網其他相關文章!