首頁 > 後端開發 > Python教學 > 快速提示:用Python控制MacOS

快速提示:用Python控制MacOS

Christopher Nolan
發布: 2025-02-15 12:28:12
原創
299 人瀏覽過

Quick Tip: Controlling macOS with Python

核心要點

  • 使用pyobjc(Python到Objective-C的橋接), Python可以控制macOS的幾乎所有方面,包括訪問操作系統API、控制正在運行的應用程序和操作窗口。
  • 通過pyobjc訪問的AppKit模塊是控制macOS的強大工具。它允許Python列出所有正在運行的應用程序,激活特定應用程序並瀏覽每個應用程序的屬性。
  • 使用Python與macOS交互可能需要對Objective-C命名約定進行一些探索和理解。但是,使用Python的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,如何在Python中使用它來控制MacOS?

AppKit是macOS SDK中的一個框架,其中包含在macOS應用程序中實現圖形化、事件驅動的用戶界面所需的所有對象。它提供廣泛的類和函數,用於創建和管理應用程序窗口、處理用戶輸入、繪製圖形以及執行與用戶界面相關的其他任務。在Python中,您可以使用PyObjC橋接來訪問AppKit和其他Objective-C框架。這允許您編寫可以控制macOS應用程序、操作窗口和與系統服務交互的Python腳本。

如何在Python中安裝PyObjC模塊?

PyObjC是一個Python到Objective-C的橋接,允許您使用Python編寫功能齊全的macOS應用程序。您可以使用Python包安裝程序pip來安裝它。打開終端窗口並鍵入以下命令:pip install pyobjc。這將下載並安裝PyObjC模塊及其依賴項。安裝完成後,您可以使用import objc在Python腳本中導入該模塊。

我收到“No module named AppKit”錯誤。我該怎麼辦?

此錯誤通常表示AppKit模塊未安裝或在您的Python環境中找不到。首先,確保您已安裝PyObjC模塊(其中包括AppKit)。如果您已安裝PyObjC但仍然收到此錯誤,則您可能正在使用未安裝PyObjC的不同Python環境。在這種情況下,您需要在正確的Python環境中安裝PyObjC,或切換到已安裝PyObjC的Python環境。

如何使用Python控制macOS應用程序?

使用PyObjC橋接,您可以使用Python通過發送AppleScript命令或使用腳本橋來控制macOS應用程序。例如,您可以啟動應用程序、操作窗口、發送擊鍵並執行其他任務。這需要很好地理解Python和AppleScript,以及應用程序的腳本接口。

如何使用Python操作macOS中的窗口?

AppKit框架提供了一些用於處理窗口的類,例如NSWindowNSApplication。您可以使用這些類來獲取所有打開窗口的列表,將窗口置於最前面,調整窗口大小或移動窗口,以及執行其他與窗口相關的任務。這需要使用PyObjC橋接從Python訪問AppKit類。

我可以使用Python與macOS中的系統服務交互嗎?

是的,您可以使用Python和PyObjC橋接與macOS中的各種系統服務交互。例如,您可以使用NSWorkspace類打開URL、啟動應用程序以及執行與用戶的workspace相關的其他任務。您還可以使用NSNotificationCenter類來發布和觀察通知,這允許您的腳本響應系統事件。

如何從macOS中的Python腳本發送擊鍵?

您可以使用AppKit框架的NSEvent類來創建和發布鍵盤事件,這實際上允許您從Python腳本發送擊鍵。這需要很好地理解NSEvent類和鍵盤事件類型,以及您要按下的鍵的鍵碼。

我可以使用Python在macOS中繪製圖形嗎?

是的,AppKit框架提供了一些用於繪製圖形的類,例如NSGraphicsContextNSBezierPathNSColor。您可以使用這些類來繪製線條、形狀和圖像,設置繪圖顏色以及執行其他繪圖任務。這需要使用PyObjC橋接從Python訪問AppKit類。

如何在macOS的Python腳本中處理用戶輸入?

AppKit框架提供了一些用於處理用戶輸入的類,例如NSEventNSResponder。您可以使用這些類來獲取鼠標事件、鍵盤事件和其他類型的用戶輸入。這需要使用PyObjC橋接從Python訪問AppKit類。

我可以使用Python編寫功能齊全的macOS應用程序嗎?

是的,使用PyObjC橋接,您可以使用Python編寫功能齊全的macOS應用程序。這包括使用窗口、按鈕和其他控件創建圖形用戶界面、處理用戶輸入、繪製圖形以及與系統服務交互。但是,這需要很好地理解Python和macOS SDK,以及AppKit框架和其他Objective-C框架。

以上是快速提示:用Python控制MacOS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板