《PyWin32:Python與Windows的橋梁,解鎖系統自動化新姿勢》

什么是 PyWin32

在 Windows 平臺的 Python 開發領域中,PyWin32 是一個舉足輕重的庫,它為 Python 開發者打開了一扇直接通往 Windows 操作系統底層功能的大門。簡單來說,PyWin32 是用于 Python 訪問 Windows API(Application Programming Interface,應用程序編程接口)的庫 。Windows API 是微軟為 Windows 操作系統提供的一套編程接口,涵蓋了大量的函數、數據結構和常量,開發者能夠通過它與 Windows 操作系統進行各種交互,涉及文件系統處理、圖形用戶界面(GUI)構建、進程和線程管理、注冊表操作以及網絡通信等諸多關鍵方面。而 PyWin32 的作用就在于,它對這些復雜的 Windows API 進行了封裝,讓 Python 程序能夠便捷地調用這些 API 函數,從而實現與 Windows 操作系統的深度交互。

想象一下,你是一位想要開發一款 Windows 系統下文件管理工具的開發者。在沒有 PyWin32 時,你可能需要用 C++ 等語言,花費大量精力去直接調用 Windows API 來實現諸如文件遍歷、復制、刪除等功能,代碼量龐大且復雜,開發周期長。但有了 PyWin32,你可以使用 Python 這門簡潔、高效的語言,借助 PyWin32 提供的接口,輕松實現這些功能。例如,使用 PyWin32 中的win32file模塊,幾行代碼就能完成文件的創建、讀取和寫入操作,大大提高了開發效率。這就是 PyWin32 的魅力所在,它將 Python 的簡潔性與 Windows 系統強大的功能相結合,降低了 Windows 平臺開發的門檻,讓開發者能夠更加高效地完成各種任務。無論是開發小型的自動化腳本,還是大型的 Windows 桌面應用程序,PyWin32 都能發揮重要作用,是 Windows 平臺 Python 開發中不可或缺的工具。

為什么選擇 PyWin32

在 Windows 系統開發的廣闊領域中,Python 憑借其簡潔的語法、豐富的庫資源以及強大的功能,成為眾多開發者的首選語言。而 PyWin32 作為 Python 與 Windows 系統交互的重要橋梁,相較于其他庫,展現出了獨特的優勢,在實際應用中發揮著不可替代的作用。

與其他庫的對比優勢

  • 深度集成 Windows API:與一些通用的跨平臺庫不同,PyWin32 是專門針對 Windows 系統設計的,它能夠直接、深入地訪問 Windows API,這是其最為顯著的優勢之一。例如,在使用 Tkinter 等跨平臺 GUI 庫時,雖然可以實現基本的圖形界面功能,但在調用 Windows 系統特有的界面特性,如任務欄操作、系統托盤圖標設置等方面,就顯得力不從心。而 PyWin32 通過對 Windows API 的封裝,開發者可以輕松實現這些功能。比如,使用 PyWin32 中的win32gui模塊,能夠方便地創建具有 Windows 風格的窗口,并對窗口進行各種個性化設置,包括設置窗口的透明度、添加自定義的窗口邊框樣式等 ,使應用程序更好地融入 Windows 系統環境。
  • 高效的執行效率:由于 PyWin32 直接調用 Windows 底層 API,避免了中間層的轉換開銷,在執行涉及系統資源管理、文件操作、進程控制等任務時,具有較高的執行效率。以文件操作舉例,在處理大量文件的復制、移動或刪除任務時,使用os模塊結合 PyWin32 的win32file模塊,比單純使用os模塊要快很多。因為win32file模塊直接調用 Windows 文件系統的 API,能夠更高效地利用系統資源,減少文件操作的時間。
  • 豐富的功能支持:PyWin32 提供了廣泛的功能支持,涵蓋了 Windows 系統的各個方面,包括但不限于文件系統、注冊表、進程管理、網絡通信、COM 自動化等。相比之下,一些其他庫可能只專注于某一個特定領域的功能。例如,psutil庫主要用于系統進程和資源的管理,雖然在這方面功能強大,但對于注冊表操作、COM 組件調用等功能則無法提供支持。而 PyWin32 能夠一站式滿足開發者在 Windows 系統開發中多方面的需求,開發者無需在多個庫之間切換,降低了開發的復雜性和成本。

實際應用場景展示

  • 自動化辦公與數據處理:在日常辦公中,經常需要處理各種文檔和數據。PyWin32 與 Microsoft Office 軟件的集成能力,使其在自動化辦公領域發揮著重要作用。通過 PyWin32 的win32com模塊,開發者可以使用 Python 腳本自動化操作 Word、Excel 和 PowerPoint 等辦公軟件。比如,在處理大量的 Excel 數據報表時,可以編寫 Python 腳本讀取多個 Excel 文件中的數據,進行數據清洗、分析和匯總,然后將結果生成新的報表并保存。又或者,在制作 PPT 時,可以利用 Python 腳本根據模板自動生成 PPT 內容,大大提高了工作效率。以一個銷售數據分析的場景為例,每月需要對大量的銷售數據進行統計分析,并生成 Word 格式的報告。使用 PyWin32,首先可以通過win32com.client模塊打開 Excel 文件,讀取銷售數據,利用 Python 強大的數據分析庫(如pandas)進行數據處理和分析,然后將分析結果寫入 Word 文檔,最后自動生成一份完整的銷售分析報告,整個過程實現了自動化,節省了大量的人力和時間成本。
  • 系統管理與監控:對于系統管理員來說,PyWin32 是一個強大的工具。在 Windows 系統中,它可以用于實現系統監控、進程管理、服務控制等功能。通過win32api和win32process模塊,能夠獲取系統中正在運行的進程信息,包括進程 ID、進程名稱、內存使用情況等,還可以對進程進行啟動、停止、暫停等操作。在服務器管理中,管理員可以使用 PyWin32 編寫腳本,定期監控服務器的資源使用情況,如 CPU 使用率、內存占用、磁盤空間等。當發現資源使用異常時,自動發送郵件或短信通知管理員,以便及時采取措施進行處理。例如,當 CPU 使用率連續 5 分鐘超過 80% 時,腳本通過win32api獲取系統信息,判斷 CPU 使用率情況,然后調用郵件發送函數(借助smtplib庫結合 PyWin32 實現系統操作與郵件發送的整合),向管理員發送預警郵件,保障服務器的穩定運行。
  • GUI 應用開發:雖然 Python 有多種 GUI 開發庫,如 Tkinter、PyQt 等,但 PyWin32 在開發具有 Windows 風格的 GUI 應用程序時,具有獨特的優勢。它可以創建出與 Windows 系統原生界面風格一致的應用程序,提供更好的用戶體驗。在開發一些小型的 Windows 桌面工具時,使用 PyWin32 結合win32gui模塊,可以快速創建出簡潔、實用的圖形界面。比如,開發一個文件批量重命名工具,利用win32gui創建一個包含文件選擇框、重命名規則輸入框和執行按鈕的窗口界面,用戶通過這個界面可以方便地選擇需要重命名的文件,設置重命名規則,然后點擊按鈕即可完成文件的批量重命名操作,操作簡單直觀,符合 Windows 用戶的使用習慣。

PyWin32 的安裝與配置

安裝前準備

在安裝 PyWin32 之前,首先需要確認你系統中安裝的 Python 版本。因為 PyWin32 的不同版本對 Python 版本有一定的兼容性要求,確保兩者版本匹配能夠避免安裝和使用過程中出現不必要的錯誤 。確認 Python 版本的方法很簡單,打開命令提示符(在 Windows 系統中,通過按下 Win+R 鍵,輸入 “cmd” 并回車即可打開;在 Linux 或 macOS 系統中,可以打開終端應用),然后在命令提示符中輸入以下命令:

python --version

執行上述命令后,系統會返回當前安裝的 Python 版本號,例如 “Python 3.10.8” 。如果你的系統中安裝了多個 Python 版本,可能需要指定具體的 Python 版本路徑來確認你即將使用的 Python 版本,比如在安裝了 Python 3.8 的情況下,可使用 “python3.8 --version” 命令來查看 Python 3.8 的版本號。此外,還需要確保 pip 工具已安裝且是最新版本。pip 是 Python 的包管理工具,用于安裝、升級和卸載 Python 包。若不確定 pip 是否安裝,可以在命令提示符中輸入 “pip --version” 來檢查。若提示未找到命令,可根據 Python 的安裝方式進行 pip 的安裝,例如從官方網站下載的 Python 安裝包,在安裝過程中可勾選 “Add Python to PATH” 選項,安裝完成后 pip 也會一并安裝;若是通過 Anaconda 等環境管理器安裝的 Python,pip 也會被自動安裝。若 pip 不是最新版本,可以使用以下命令進行更新:

python -m ensurepip --upgrade
python -m pip install --upgrade pip

安裝步驟

當確認 Python 版本和 pip 工具都準備就緒后,就可以開始安裝 PyWin32 了。使用 pip 工具安裝 PyWin32 是最為簡單和推薦的方式,因為它可以自動處理依賴關系,適用于大多數用戶。在命令提示符中輸入以下安裝命令:

pip install pywin32

執行該命令后,pip 會從 Python 的官方包管理庫 PyPI(Python Package Index)下載 PyWin32 的安裝包,并自動完成安裝過程。安裝過程中,命令提示符會顯示下載進度和安裝信息。如果網絡連接正常,等待一段時間后,當看到類似于 “Successfully installed pywin32-xxx” 的提示信息時,說明 PyWin32 已成功安裝,其中 “xxx” 表示安裝的 PyWin32 的具體版本號。例如,當安裝完成后,可能會看到 “Successfully installed pywin32-306” 這樣的提示,表明安裝的是 PyWin32 的 306 版本。在某些情況下,可能需要安裝特定版本的 PyWin32。比如在項目中,由于兼容性或其他需求,需要使用特定版本的 PyWin32。此時,可以在安裝命令中指定版本號,例如安裝 305 版本的 PyWin32,命令如下:

pip install pywin32==305

驗證安裝

安裝完成后,需要驗證 PyWin32 是否成功安裝。驗證方法是通過 Python 交互式命令行,嘗試導入 PyWin32 提供的模塊。在命令提示符中輸入 “python”,進入 Python 交互式環境,然后輸入以下代碼:

import win32api

如果沒有報錯,說明 PyWin32 模塊已經成功安裝。這是因為win32api是 PyWin32 庫中一個常用的模塊,用于訪問 Windows API 中的基礎函數。當能夠成功導入win32api模塊時,就表明 PyWin32 庫已經被正確安裝到 Python 環境中,并且 Python 能夠找到并加載該模塊。除了導入模塊外,還可以運行一些簡單的示例代碼來測試 PyWin32 的功能,以確保其正常工作。以下是一個使用win32api獲取當前系統時間的示例代碼:

import win32api# 獲取系統當前時間current_time = win32api.GetLocalTime()print(f"Current local time: {current_time}")

在上述代碼中,首先導入win32api模塊,然后使用win32api中的GetLocalTime函數獲取當前本地時間,并將其打印到控制臺。運行這段代碼,如果能夠正確輸出當前系統時間,如 “Current local time: (2024, 10, 10, 4, 15, 30, 500, 0)”,則進一步驗證了 PyWin32 安裝成功且能夠正常使用。

PyWin32 的核心功能與常用模塊

PyWin32 作為一個功能強大的庫,為 Python 開發者提供了豐富的工具,使其能夠深入挖掘 Windows 操作系統的各種功能。它包含多個模塊,每個模塊都專注于特定領域的功能實現,涵蓋了從基礎的系統操作到復雜的圖形界面和注冊表管理等多個方面。通過這些模塊,開發者可以輕松實現文件操作、窗口管理、進程控制以及與 Windows 系統的深度交互,極大地拓展了 Python 在 Windows 平臺上的應用范圍。

win32api 模塊

win32api模塊是 PyWin32 庫中用于訪問基本 Windows API 函數的核心模塊之一,它提供了一系列函數,使開發者能夠與 Windows 操作系統進行底層交互,涉及文件系統、系統信息獲取、消息框顯示等多個方面。在文件操作方面,開發者可以使用win32api模塊來實現文件的復制、移動和刪除等功能。例如,使用CopyFile函數可以方便地將一個文件復制到指定的目標路徑。在系統信息獲取上,該模塊同樣表現出色。比如,通過GetSystemMetrics函數可以獲取系統的各種度量信息,如屏幕的寬度和高度,這在開發需要適配不同屏幕分辨率的應用程序時非常有用。在處理一些需要用戶確認的操作時,win32api模塊的MessageBox函數就能派上用場。它可以彈出一個包含指定信息和按鈕的消息框,等待用戶的操作響應,為用戶交互提供了便捷的方式。以下是使用win32api模塊獲取系統時間和顯示消息框的示例代碼:

import win32api# 獲取系統時間system_time = win32api.GetSystemTime()print(f"System Time: {system_time}")# 顯示一個消息框win32api.MessageBox(0, 'Hello, World!', 'Message', 0x00001000)

在上述代碼中,首先調用win32api.GetSystemTime函數獲取系統當前時間,并將其打印輸出。然后,使用win32api.MessageBox函數顯示一個消息框,其中第一個參數0表示父窗口句柄(這里為無父窗口),第二個參數'Hello, World!'是消息框中顯示的內容,第三個參數'Message'是消息框的標題,最后一個參數0x00001000是消息框的樣式標識,這里表示顯示一個帶有確定按鈕的消息框。

win32con 模塊

win32con模塊在 PyWin32 庫中扮演著不可或缺的角色,它包含了大量 Windows API 所需的常量,這些常量廣泛應用于各種 Windows API 函數的參數設置和返回值判斷,涉及窗口樣式、消息框類型、鍵盤和鼠標事件等眾多領域。在窗口操作中,通過win32con模塊提供的常量可以精確地定義窗口的樣式和行為。例如,WS_OVERLAPPEDWINDOW常量用于創建一個具有標題欄、邊框、最大化和最小化按鈕的標準重疊窗口,開發者可以在使用win32gui.CreateWindow函數創建窗口時,將該常量作為參數傳入,以創建出符合需求的窗口樣式。在處理消息框時,win32con模塊的常量同樣發揮著重要作用。比如,MB_OKCANCEL常量用于指定消息框顯示 “確定” 和 “取消” 按鈕,當使用win32api.MessageBox函數創建消息框時,將該常量作為樣式參數傳入,就可以創建出包含 “確定” 和 “取消” 按鈕的消息框,方便用戶進行選擇操作。在獲取屏幕分辨率的操作中,win32con模塊與win32api模塊配合使用。通過win32api.GetSystemMetrics函數,并傳入win32con模塊中的SM_CXSCREEN(表示屏幕寬度)和SM_CYSCREEN(表示屏幕高度)常量,就可以輕松獲取屏幕的分辨率。以下是使用win32con模塊獲取屏幕分辨率的示例代碼:

import win32apiimport win32con# 獲取屏幕分辨率width = win32api.GetSystemMetrics(win32con.SM_CXSCREEN)height = win32api.GetSystemMetrics(win32con.SM_CYSCREEN)print(f"Screen resolution: {width}x{height}")

在這段代碼中,通過win32api.GetSystemMetrics函數分別傳入win32con.SM_CXSCREEN和win32con.SM_CYSCREEN常量,獲取到屏幕的寬度和高度,并將其打印輸出,得到屏幕分辨率信息。

win32gui 模塊

win32gui模塊是 PyWin32 庫中用于訪問和控制 Windows 圖形用戶界面(GUI)組件的重要模塊,它為開發者提供了豐富的功能,涵蓋窗口操作、菜單管理、繪圖等多個方面,使得開發者能夠創建出功能強大、界面友好的 Windows 應用程序。在窗口操作方面,win32gui模塊提供了一系列函數,用于創建、顯示、隱藏、移動和調整窗口大小等操作。例如,使用CreateWindow函數可以創建一個新的窗口,通過設置不同的參數,可以定義窗口的類名、標題、樣式、位置和大小等屬性。使用ShowWindow函數可以控制窗口的顯示狀態,如顯示、隱藏或最小化窗口。在菜單管理方面,win32gui模塊允許開發者創建、修改和操作菜單。通過CreateMenu函數可以創建一個新的菜單,然后使用AppendMenu函數向菜單中添加菜單項,并可以為每個菜單項指定命令 ID 和顯示文本。當用戶點擊菜單項時,可以通過處理相應的命令消息來執行特定的操作。在繪圖方面,win32gui模塊與其他模塊(如win32ui)配合使用,可以實現復雜的圖形繪制功能。例如,可以使用BeginPaint和EndPaint函數來開始和結束繪圖操作,使用Rectangle、Ellipse等函數繪制各種圖形,并使用SetTextColor和SetBkColor函數設置文本顏色和背景顏色。以下是使用win32gui模塊列出所有窗口標題的示例代碼:

import win32guidef enum_window_titles(hwnd, titles):if win32gui.IsWindowVisible(hwnd):titles.append(win32gui.GetWindowText(hwnd))titles = []win32gui.EnumWindows(enum_window_titles, titles)print("Window Titles:", titles)

在上述代碼中,定義了一個回調函數enum_window_titles,該函數用于判斷窗口是否可見,如果可見則將窗口標題添加到列表titles中。然后使用win32gui.EnumWindows函數枚舉所有窗口,并將回調函數和列表titles作為參數傳入,遍歷所有窗口并將可見窗口的標題添加到titles列表中,最后打印出所有可見窗口的標題。

win32file 模塊

win32file模塊是 PyWin32 庫中專門用于文件和目錄操作的模塊,它提供了一系列函數,使開發者能夠方便地進行文件的創建、讀取、寫入、關閉、復制、移動和刪除等操作,以及目錄的創建、刪除、遍歷等操作,為文件管理相關的應用開發提供了強大的支持。在文件創建方面,使用CreateFile函數可以創建一個新的文件,通過設置不同的參數,可以指定文件的名稱、訪問權限、共享模式、創建方式和文件屬性等。例如,使用CREATE_ALWAYS創建方式可以確保每次調用CreateFile函數時都會創建一個新文件,如果文件已存在則會覆蓋原文件。在文件讀取和寫入操作中,win32file模塊提供了ReadFile和WriteFile函數。使用ReadFile函數可以從指定文件中讀取數據,需要傳入文件句柄、讀取緩沖區和讀取的字節數等參數;使用WriteFile函數可以將數據寫入到指定文件中,需要傳入文件句柄、要寫入的數據和寫入的字節數等參數。在目錄操作方面,win32file模塊提供了CreateDirectory函數用于創建新目錄,RemoveDirectory函數用于刪除空目錄,FindFirstFile和FindNextFile函數用于遍歷目錄中的文件和子目錄。以下是使用win32file模塊創建、讀取和寫入文件的示例代碼:

import win32file# 創建一個文件handle = win32file.CreateFile('example.txt',win32file.GENERIC_WRITE,0,None,win32file.CREATE_ALWAYS,0,None)# 寫入文件win32file.WriteFile(handle, b'Hello, World!')# 關閉文件win32file.CloseHandle(handle)# 打開文件用于讀取handle = win32file.CreateFile('example.txt',win32file.GENERIC_READ,0,None,win32file.OPEN_EXISTING,0,None)# 讀取文件data = win32file.ReadFile(handle, 1024)print(f"Read data: {data[1].decode('utf-8')}")# 關閉文件win32file.CloseHandle(handle)

在上述代碼中,首先使用CreateFile函數以寫入模式創建一個名為example.txt的文件,并獲取文件句柄。然后使用WriteFile函數將字節數據b'Hello, World!'寫入文件中,接著關閉文件句柄。之后再次使用CreateFile函數以讀取模式打開example.txt文件,獲取文件句柄,使用ReadFile函數讀取文件內容,并將讀取到的數據解碼為 UTF-8 格式的字符串后打印輸出,最后關閉文件句柄。

win32registry 模塊

win32registry模塊是 PyWin32 庫中用于訪問 Windows 注冊表的模塊,它為開發者提供了一系列函數,使得開發者能夠讀取、寫入和修改注冊表中的鍵值,實現對系統配置信息的管理和操作,在系統級應用開發和系統配置管理中具有重要作用。在讀取注冊表鍵值方面,win32registry模塊提供了RegOpenKey和RegQueryValueEx函數。使用RegOpenKey函數可以打開指定的注冊表鍵,需要傳入根鍵(如HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等)和子鍵路徑作為參數。打開鍵后,使用RegQueryValueEx函數可以查詢該鍵下指定值的名稱和數據。在寫入注冊表鍵值時,使用RegSetValueEx函數可以設置指定鍵下的值。需要傳入鍵句柄、值名稱、保留參數、值類型和要設置的數據作為參數。在創建和刪除注冊表鍵方面,win32registry模塊提供了RegCreateKey和RegDeleteKey函數。使用RegCreateKey函數可以創建新的注冊表鍵,如果鍵已存在則打開該鍵;使用RegDeleteKey函數可以刪除指定的注冊表鍵,但需要注意,刪除操作通常需要管理員權限,并且刪除鍵時會同時刪除該鍵下的所有子鍵和值。以下是使用win32registry模塊讀取注冊表鍵值的示例代碼:

import win32apiimport win32con# 打開注冊表鍵key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer')# 查詢鍵值value, regtype = win32api.RegQueryValueEx(key, 'ShellState')print(f"Registry Value: {value}")# 關閉注冊表鍵win32api.RegCloseKey(key)

在上述代碼中,首先使用win32api.RegOpenKey函數打開HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer注冊表鍵,獲取鍵句柄。然后使用win32api.RegQueryValueEx函數查詢該鍵下名為ShellState的值,返回值value為查詢到的值,regtype為值的類型。最后使用win32api.RegCloseKey函數關閉注冊表鍵,釋放資源。

PyWin32 的應用場景實戰

辦公自動化

在現代辦公環境中,自動化任務處理能夠顯著提高工作效率,減少重復性勞動。PyWin32 憑借其強大的功能,在辦公自動化領域發揮著重要作用,特別是在操作 Excel、Word 等 Office 應用方面。通過 PyWin32,我們可以使用 Python 代碼實現對 Office 文檔的創建、編輯、數據處理等操作,實現辦公流程的自動化。

以創建 Excel 文件并寫入數據為例,使用 PyWin32 的win32com模塊,只需幾行代碼就能完成復雜的操作。以下是一個簡單的示例:

import win32com.client# 啟動Excel應用程序excel_app = win32com.client.Dispatch('Excel.Application')# 創建新的工作簿workbook = excel_app.Workbooks.Add()# 選擇第一個工作表sheet = workbook.ActiveSheet# 寫入數據data = [['姓名', '年齡', '職業'],['張三', 25, '工程師'],['李四', 30, '教師'],['王五', 28, '醫生']]for row in range(len(data)):for col in range(len(data[row])):sheet.Cells(row + 1, col + 1).Value = data[row][col]# 保存工作簿workbook.SaveAs('example.xlsx')# 關閉Excel應用程序excel_app.Quit()

在上述代碼中,首先使用win32com.client.Dispatch('Excel.Application')啟動 Excel 應用程序,然后創建一個新的工作簿,并選擇其活動工作表。接著,通過嵌套循環將數據逐行逐列地寫入工作表的單元格中。最后,使用SaveAs方法將工作簿保存為example.xlsx文件,并關閉 Excel 應用程序。這樣,就通過 Python 代碼實現了創建 Excel 文件并寫入數據的自動化操作。

在實際辦公中,我們還經常需要處理 Word 文檔,比如生成報告、填寫模板等。使用 PyWin32 可以輕松實現這些功能。以下是一個向 Word 文檔中添加內容和表格的示例:

import win32com.client# 啟動Word應用程序word_app = win32com.client.Dispatch('Word.Application')word_app.Visible = True # 讓Word可見# 獲取當前打開的文檔(如果沒有打開的文檔,可以使用Documents.Add()創建新文檔)doc = word_app.ActiveDocument# 在文檔末尾添加文本doc.Content.InsertAfter('這是一個使用Python修改的文檔。\n')# 插入表格table = doc.Tables.Add(Range=doc.Content, NumRows=3, NumColumns=3)# 填充表格for row in range(1, 4):for col in range(1, 4):table.Cell(row, col).Range.Text = f'行{row} 列{col}'# 保存文檔doc.Save()

在這個示例中,首先啟動 Word 應用程序并使其可見,然后獲取當前活動文檔。接著,使用InsertAfter方法在文檔末尾添加一段文本。之后,通過Tables.Add方法在文檔中插入一個 3x3 的表格,并使用嵌套循環為表格的每個單元格填充內容。最后,保存對文檔的修改。通過這樣的方式,我們可以利用 Python 和 PyWin32 實現對 Word 文檔的自動化編輯,大大提高辦公效率。

除了操作 Excel 和 Word 文檔,PyWin32 還可以用于自動化發送郵件。在日常辦公中,經常需要向多個收件人發送內容相似的郵件,使用 PyWin32 結合win32com模塊可以實現郵件的自動發送,節省大量時間和精力。以下是一個簡單的示例:

import win32com.client# 啟動Outlook應用程序outlook = win32com.client.Dispatch('Outlook.Application')# 創建郵件mail = outlook.CreateItem(0)# 設置郵件屬性mail.To = 'recipient@example.com'mail.CC = 'cc_recipient@example.com' # 抄送mail.Subject = '自動化郵件測試'mail.Body = '這是一封通過Python自動化發送的郵件。'# 添加附件(可選)# mail.Attachments.Add('C:\\path\\to\\attachment.pdf')# 發送郵件mail.Send()

在上述代碼中,首先使用win32com.client.Dispatch('Outlook.Application')啟動 Outlook 應用程序,然后創建一個新的郵件對象。接著,設置郵件的收件人(To)、抄送(CC)、主題(Subject)和正文(Body)等屬性。如果有需要,還可以使用Attachments.Add方法添加附件。最后,調用Send方法發送郵件。通過這個示例,我們可以看到如何利用 PyWin32 實現郵件的自動化發送,這在批量發送通知、報告等場景中非常實用。

系統管理與自動化任務

在系統管理領域,PyWin32 提供了豐富的功能,能夠幫助系統管理員實現系統監控、文件管理以及自動化日常任務等操作,大大提高了系統管理的效率和便捷性。

使用 PyWin32 可以輕松實現系統監控,例如獲取系統的各種信息,包括 CPU 使用率、內存占用、磁盤空間等。通過實時監控這些系統指標,管理員可以及時發現系統異常并采取相應措施。以下是一個使用 PyWin32 獲取 CPU 使用率和內存占用的示例:

import win32apiimport win32pdh# 獲取CPU使用率query = win32pdh.OpenQuery()counter = win32pdh.AddEnglishCounter(query, '\\Processor(_Total)\\% Processor Time')win32pdh.CollectQueryData(query)_, cpu_usage = win32pdh.GetFormattedCounterValue(counter, win32pdh.PDH_FMT_LONG)win32pdh.CloseQuery(query)# 獲取內存信息memory_status = win32api.GlobalMemoryStatusEx()total_memory = memory_status['ullTotalPhys'] / (1024.0 * 1024.0) # 轉換為MBused_memory = (total_memory - memory_status['ullAvailPhys'] / (1024.0 * 1024.0)) # 轉換為MBmemory_percent = used_memory / total_memory * 100print(f'CPU使用率: {cpu_usage}%')print(f'總內存: {total_memory:.2f} MB')print(f'已使用內存: {used_memory:.2f} MB')print(f'內存使用率: {memory_percent:.2f}%')

在上述代碼中,使用win32pdh模塊獲取 CPU 使用率。首先打開一個查詢,添加一個用于獲取整體 CPU 使用率的計數器,收集查詢數據后,獲取格式化后的 CPU 使用率值,最后關閉查詢。對于內存信息的獲取,使用win32api.GlobalMemoryStatusEx函數獲取系統內存狀態信息,通過計算得到總內存、已使用內存和內存使用率,并將結果打印輸出。通過這樣的方式,系統管理員可以實時了解系統的 CPU 和內存使用情況,以便及時進行資源調配和優化。

在文件管理方面,PyWin32 提供了強大的功能,能夠實現文件和目錄的各種操作,如創建文件夾、復制文件、刪除文件等。以下是一個創建文件夾和復制文件的示例:

import win32fileimport win32conimport shutil# 創建文件夾folder_path = 'C:\\new_folder'try:win32file.CreateDirectory(folder_path, None)print(f'文件夾 {folder_path} 創建成功')except Exception as e:print(f'創建文件夾失敗: {e}')# 復制文件source_file = 'C:\\source.txt'destination_file = 'C:\\new_folder\\source.txt'try:shutil.copy2(source_file, destination_file)print(f'文件 {source_file} 復制到 {destination_file} 成功')except Exception as e:print(f'復制文件失敗: {e}')

在這個示例中,首先使用win32file.CreateDirectory函數創建一個新的文件夾,指定文件夾路徑為C:\new_folder。如果創建成功,打印成功信息;如果創建過程中出現異常,打印錯誤信息。接著,使用shutil.copy2函數將C:\source.txt文件復制到新創建的文件夾中,并命名為source.txt。同樣,如果復制成功,打印成功信息;如果失敗,打印錯誤信息。通過這些操作,展示了如何使用 PyWin32 進行文件管理,方便系統管理員對文件和目錄進行操作。

PyWin32 還可以用于自動化日常任務,例如定時執行某個程序、定期備份文件等。以下是一個使用win32api和subprocess模塊定時執行程序的示例:

import win32apiimport subprocessimport time# 定時執行程序program_path = 'C:\\Program Files\\example\\program.exe'while True:current_time = time.localtime()if current_time.tm_hour == 2 and current_time.tm_min == 0: # 每天凌晨2點執行try:subprocess.Popen(program_path)print(f'在 {time.strftime("%Y-%m-%d %H:%M:%S")} 執行程序 {program_path}')except Exception as e:print(f'執行程序失敗: {e}')time.sleep(3600) # 等待1小時,避免重復執行time.sleep(60) # 每分鐘檢查一次時間

在上述代碼中,使用一個無限循環不斷檢查當前時間。當時間達到每天凌晨 2 點時,使用subprocess.Popen函數啟動指定路徑的程序C:\Program Files\example\program.exe。如果程序啟動成功,打印執行信息;如果啟動失敗,打印錯誤信息。每次檢查時間后,程序會等待 1 分鐘再次檢查,以避免資源浪費。通過這樣的方式,實現了定時執行程序的自動化任務,幫助系統管理員更好地管理系統運行。

在自動化任務中,模擬鼠標點擊和鍵盤輸入也是常見的需求。PyWin32 可以通過win32api和win32con模塊實現這些操作。以下是一個簡單的模擬鼠標點擊的示例:

import win32apiimport win32condef click(x, y):win32api.SetCursorPos((x, y))win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)# 模擬在坐標 (100, 100) 處點擊鼠標左鍵click(100, 100)

在這個示例中,定義了一個click函數,該函數接受兩個參數x和y,表示鼠標點擊的坐標。在函數內部,首先使用win32api.SetCursorPos函數將鼠標光標移動到指定坐標,然后通過win32api.mouse_event函數模擬鼠標左鍵按下和抬起的操作,從而實現鼠標點擊的模擬。通過這種方式,可以在自動化任務中模擬用戶的鼠標操作,實現更復雜的自動化功能。

圖形界面交互

在 Windows 系統中,圖形界面交互是用戶與應用程序進行交互的重要方式。PyWin32 提供了豐富的功能,使開發者能夠輕松實現與圖形界面的交互,包括獲取活動窗口句柄、顯示窗口、改變窗口大小等操作。這些功能在開發桌面應用程序、自動化測試工具等方面具有廣泛的應用。

獲取活動窗口句柄是與圖形界面交互的基礎操作之一。通過獲取活動窗口句柄,可以對該窗口進行各種操作,如獲取窗口標題、位置、大小等信息,或者對窗口進行最小化、最大化、關閉等操作。以下是使用 PyWin32 獲取活動窗口句柄和標題的示例:

import win32gui# 獲取活動窗口句柄active_window = win32gui.GetForegroundWindow()# 獲取活動窗口標題window_title = win32gui.GetWindowText(active_window)print(f'活動窗口句柄: {active_window}')print(f'活動窗口標題: {window_title}')

在上述代碼中,使用win32gui.GetForegroundWindow函數獲取當前活動窗口的句柄,然后使用win32gui.GetWindowText函數獲取該窗口的標題。最后,將活動窗口句柄和標題打印輸出。通過這種方式,開發者可以方便地獲取當前用戶正在操作的窗口信息,為后續的窗口操作提供基礎。

顯示窗口是圖形界面交互中的常見操作。有時候,我們需要將隱藏的窗口顯示出來,或者在程序中創建新的窗口并顯示。使用 PyWin32 的win32gui模塊可以輕松實現這些操作。以下是一個創建并顯示窗口的示例:

import win32guiimport win32con# 窗口過程函數def WndProc(hwnd, msg, wParam, lParam):if msg == win32con.WM_DESTROY:win32gui.PostQuitMessage(0)else:return win32gui.DefWindowProc(hwnd, msg, wParam, lParam)return 0# 注冊窗口類wc = win32gui.WNDCLASS()wc.lpszClassName = 'MyWindowClass'wc.lpfnWndProc = WndProcwc.hInstance = win32gui.GetModuleHandle(None)wc.hbrBackground = win32con.COLOR_WINDOW + 1classAtom = win32gui.RegisterClass(wc)# 創建窗口hwnd = win32gui.CreateWindowEx(0,classAtom,'我的窗口',win32con.WS_OVERLAPPEDWINDOW,win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,400, 300,0, 0,wc.hInstance,None)# 顯示窗口win32gui.ShowWindow(hwnd, win32con.SW_SHOW)win32gui.UpdateWindow(hwnd)# 進入消息循環win32gui.PumpMessages()

在這個示例中,首先定義了一個窗口過程函數WndProc,用于處理窗口收到的消息。當窗口收到WM_DESTROY消息時,調用win32gui.PostQuitMessage函數發送退出消息,結束程序。然后,注冊一個窗口類,設置窗口類的名稱、窗口過程函數、實例句柄和背景顏色等屬性。接著,使用win32gui.CreateWindowEx函數創建一個新的窗口,指定窗口的類名、標題、樣式、位置和大小等參數。最后,使用win32gui.ShowWindow函數顯示窗口,并調用win32gui.UpdateWindow函數更新窗口。通過win32gui.PumpMessages函數進入消息循環,等待處理窗口消息,實現窗口的正常顯示和交互。

改變窗口大小是圖形界面交互中的另一個常見需求。在某些情況下,我們需要根據用戶的操作或者程序的邏輯動態調整窗口的大小。使用 PyWin32 可以方便地實現這一功能。以下是一個獲取窗口大小并改變窗口大小的示例:

import win32guiimport win32con# 獲取活動窗口句柄active_window = win32gui.GetForegroundWindow()# 獲取窗口當前位置和大小left, top, right, bottom = win32gui.GetWindowRect(active_window)width = right - leftheight = bottom - topprint(f'當前窗口大小: 寬 {width},高 {height}')# 改變窗口大小new_width = 600new_height = 400win32gui.SetWindowPos(active_window, None, left, top, new_width, new_height, win32con.SWP_NOZORDER)# 獲取改變后的窗口大小left, top, right, bottom = win32gui.GetWindowRect(active_window)width = right - leftheight = bottom - topprint(f'改變后的窗口大小: 寬 {width},高 {height}')

在上述代碼中,首先獲取當前活動窗口的句柄,然后使用win32gui.GetWindowRect函數獲取窗口的當前位置和大小,計算出窗口的寬度和高度并打印輸出。接著,定義新的窗口寬度和高度,使用win32gui.SetWindowPos函數改變窗口的大小,其中win32con.SWP_NOZORDER參數表示不改變窗口的 Z 軸順序。最后,再次獲取窗口的位置和大小,驗證窗口大小是否已成功改變,并打印輸出改變后的窗口大小。通過這樣的操作,實現了對窗口大小的動態調整,滿足不同的應用場景需求。

PyWin32 使用過程中的常見問題及解決方法

在使用 PyWin32 的過程中,開發者可能會遇到各種問題,這些問題涵蓋了安裝和運行時的不同場景。了解這些常見問題及解決方法,能夠幫助開發者更高效地使用 PyWin32,減少開發過程中的阻礙。

安裝問題

  • 安裝路徑問題:Python 解釋器可能無法找到安裝的 PyWin32 模塊,通常發生在使用非標準方式安裝 PyWin32 的情況下,例如手動解壓安裝包到非 Python 的 site-packages 目錄。解決方法是仔細檢查 PyWin32 的安裝路徑,確保其在 Python 解釋器的搜索路徑中。可以通過import sys; print(sys.path)查看 Python 解釋器的搜索路徑,若安裝路徑不在其中,可將安裝路徑添加到sys.path中,或者重新安裝 PyWin32 到 Python 的 site-packages 目錄。
  • 版本不兼容:安裝的 PyWin32 版本可能與 Python 版本不兼容。在安裝前,務必確認下載并安裝與 Python 版本(例如 Python 3.7、Python 3.9 等)相匹配的 PyWin32 版本。如果已經安裝了不兼容的版本,先使用pip uninstall pywin32卸載,然后重新安裝兼容版本。
  • 虛擬環境問題:若使用虛擬環境(virtualenv 或 conda),需要在激活虛擬環境后才能使用該虛擬環境中安裝的 PyWin32。如果沒有激活虛擬環境,可能會使用系統全局的 Python 解釋器,而該解釋器中可能并沒有安裝 PyWin32。解決方法是在使用 PyWin32 之前,先激活對應的虛擬環境。例如,使用source venv/bin/activate(Linux 或 macOS)或venv\Scripts\activate(Windows)激活虛擬環境,其中venv是虛擬環境的名稱。
  • 多個 Python 版本:系統上安裝了多個 Python 版本時,要確保正在使用正確的 Python 解釋器來運行代碼,并且 PyWin32 安裝在該解釋器的環境中。在安裝 PyWin32 時,可以指定 Python 版本對應的 pip 進行安裝,如python3.8 -m pip install pywin32,以確保安裝到正確的 Python 環境中。
  • 安裝過程錯誤:PyWin32 的安裝過程可能存在問題,導致安裝不完整或失敗。建議嘗試重新安裝 PyWin32,最好使用管理員權限。可以先使用pip uninstall pywin32卸載,然后以管理員身份運行命令提示符或終端,再重新執行安裝命令pip install pywin32。

運行時錯誤

  • 找不到模塊:出現 “ModuleNotFoundError: No module named 'win32com'” 或類似錯誤提示,即使認為已經安裝了 PyWin32,也需要確認相關子模塊是否被正確安裝和加載。除了檢查安裝路徑、版本兼容性等常見問題外,還可能是由于緩存文件導致的錯誤。例如,在使用win32com模塊時,可能會因為緩存文件有問題而報錯。解決方法是刪除緩存文件,以win32com為例,可以使用以下代碼找到并刪除緩存文件:
from win32com.client.gencache import EnsureDispatchimport sysimport shutilimport os# 找到緩存目錄cache_dir = os.path.join(sys.prefix, 'Lib','site-packages', 'win32com', 'gen_py')if os.path.exists(cache_dir):shutil.rmtree(cache_dir)
  • 無法正常執行:在用 Python 調用 PyWin32 進行一些操作時,可能會出現無法正常執行的情況。例如,在批量將 xls 文件轉換為 xlsx 文件時,報錯 “AttributeError: module ‘win32com.gen_py.00020813 - 0000 - 0000 - C000 - 000000000046x0x1x9’ has no attribute ‘CLSIDToClassMap’”。這種錯誤原因不太明確,可能與系統升級等因素有關。解決方法同樣是刪除緩存文件,按照上述刪除win32com緩存文件的方法進行操作后,重新運行程序,通常可以解決該問題。
  • DLL 加載失敗:出現 “ImportError: DLL load failed: The specified module could not be found.” 錯誤,這可能是由于缺失依賴、版本沖突或系統環境問題導致的。首先檢查是否安裝了 Python for Windows 擴展包等必要依賴,確保 Python 環境已正確安裝并包含了這些基礎組件。若存在版本沖突,檢查是否有其他 Python 版本同時存在,并且其中一個已經安裝了 Pywin32,導致路徑優先級混亂。嘗試通過命令行指定 Python 解釋器安裝,如python -m pip install pywin32。此外,還可以嘗試重新安裝 PyWin32,確保安裝過程完整無誤。

總結與展望

PyWin32 作為 Python 在 Windows 平臺開發的強大工具,以其對 Windows API 的深度封裝,為開發者打開了通往 Windows 系統底層功能的大門。從基礎的文件操作、系統信息獲取,到復雜的圖形界面交互、辦公軟件自動化,PyWin32 展現出了廣泛的適用性和強大的功能。在辦公自動化領域,它讓繁瑣的文檔處理和數據統計工作實現了自動化,大大提高了辦公效率;在系統管理方面,無論是系統監控、文件管理還是自動化任務執行,PyWin32 都提供了便捷的解決方案;在圖形界面交互中,它使得開發者能夠輕松實現與 Windows 圖形界面的各種交互操作,創建出功能豐富、用戶體驗良好的應用程序。

然而,在使用 PyWin32 的過程中,我們也遇到了一些常見問題,如安裝過程中的路徑問題、版本不兼容問題,以及運行時的模塊找不到、無法正常執行等錯誤。通過對這些問題的分析和解決,我們積累了寶貴的經驗,也更加深入地了解了 PyWin32 的工作原理和使用技巧。

展望未來,隨著 Windows 系統的不斷發展和更新,Windows API 也將持續演進,PyWin32 有望進一步拓展其功能,為開發者提供更多與 Windows 系統交互的方式。在自動化領域,PyWin32 可能會與人工智能、機器學習等技術相結合,實現更加智能化的自動化任務,例如根據系統狀態自動調整配置、智能分析系統數據并提供優化建議等。在辦公自動化方面,它可能會更好地支持新興的辦公軟件和辦公模式,實現更高效的團隊協作和數據處理。對于廣大開發者來說,深入學習和應用 PyWin32,不僅能夠提升在 Windows 平臺的開發能力,還能為解決實際問題提供更多的思路和方法,創造出更具創新性和實用性的應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vite如何生成gzip,并在服務器上如何設置開啟

1. 安裝插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068萬預算!中國足協大模型項目招標,用AI技術驅動足球革命

中國足協啟動國際足聯“前進計劃”下的大數據模型項目,預算1068萬元。該項目將建立足球大數據分析平臺,利用AI技術為國家隊、青少年足球、業余球員及教練員裁判員提供精準數據分析服務,旨在通過科技手段提升中國足球競技水平。 中國足球迎來數…

AI產品經理面試寶典第12天:AI產品經理的思維與轉型路徑面試題與答法

多樣化思維:如何跳出單一框架解題? 面試官:AI產品常面臨復雜場景,請舉例說明你如何運用多樣化思維解決問題? 你的回答:我會從三個維度展開:多角度拆解需求本質,多層級融合思維模式,多變量尋找最優解。比如設計兒童教育機器人時,不僅考慮功能實現(技術層),還融入情…

vscode.window對象講解

一、vscode.window 核心架構圖 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

為什么一個 @Transactional 注解就能開啟事務?揭秘 Spring AOP 的底層魔法

你是否也曾深陷在各種“額外”邏輯的泥潭,為了給一個核心業務方法增加日志、權限校驗或緩存,而不得不將這些非核心代碼硬塞進業務類中,導致代碼臃腫、職責不清?是時候用代理設計模式 (Proxy Design Pattern) 來解脫了!…

《Spring 中上下文傳遞的那些事兒》Part 8:構建統一上下文框架設計與實現(實戰篇)

📝 Part 8:構建統一上下文框架設計與實現(實戰篇) 在實際項目中,我們往往需要處理多種上下文來源,例如: Web 請求上下文(RequestContextHolder)日志追蹤上下文&#xf…

配置驅動開發:初探零代碼構建嵌入式軟件配置工具

前言在嵌入式軟件開發中,硬件初始化與寄存器配置長期依賴人工編寫重復代碼。以STM32外設初始化為例,開發者需手動完成時鐘使能、引腳模式設置、參數配置等步驟,不僅耗時易錯(如位掩碼寫反、模式枚舉值混淆)&#xff0c…

Elasticsearch混合搜索深度解析(下):執行機制與完整流程

引言 在上篇中,我們發現了KNN結果通過SubSearch機制被保留的關鍵事實。本篇將繼續深入分析混合搜索的執行機制,揭示完整的處理流程,并解答之前的所有疑惑。 深入源碼分析 1. SubSearch的執行機制 1.1 KnnScoreDocQueryBuilder的實現 KNN結果被…

Apache HTTP Server 從安裝到配置

一、Apache 是什么?Apache(全稱 Apache HTTP Server)是當前最流行的開源Web服務器軟件之一,由Apache軟件基金會維護。它以穩定性高、模塊化設計和靈活的配置著稱,支持Linux、Windows等多平臺,是搭建個人博客…

php中調用對象的方法可以使用array($object, ‘methodName‘)?

是的,在PHP中,array($object, methodName) 是一種標準的回調語法,用于表示“調用某個對象的特定方法”。這種語法可以被許多函數(如 call_user_func()、call_user_func_array()、usort() 等)識別并執行。 語法原理 在P…

【設計模式】單例模式 餓漢式單例與懶漢式單例

單例模式(Singleton Pattern)詳解一、單例模式簡介 單例模式(Singleton Pattern) 是一種 創建型設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取這個實例。(對象創建型模式&…

vue3 el-table 行數據沾滿格自動換行

在使用 Vue 3 結合 Element Plus 的 <el-table> 組件時&#xff0c;如果你希望當表格中的行數據文本過長時能夠自動換行&#xff0c;而不是溢出到其他單元格或簡單地截斷&#xff0c;你可以通過以下幾種方式來實現&#xff1a;方法 1&#xff1a;使用 CSS最簡單的方法是通…

windows電腦遠程win系統服務器上的wsl2

情況 我自己使用win11筆記本電腦&#xff0c;想要遠程win11服務器上的wsl2 我這里只有服務器安裝了wsl2&#xff0c;win11筆記本沒有安裝 因此下面提到的Ubuntu終端指的是win服務器上的wsl2終端 一定要區分是在哪里輸入命令&#xff01;&#xff01; 安裝SSH 在服務器上&#x…

神經輻射場 (NeRF):重構三維世界的AI新視角

神經輻射場 (NeRF)&#xff1a;重構三維世界的AI新視角 舊金山蜿蜒起伏的街道上&#xff0c;一輛裝備12個攝像頭的Waymo自動駕駛測試車緩緩駛過。它記錄的280萬張街景圖像并未被簡單地拼接成平面地圖&#xff0c;而是被輸入一個名為Block-NeRF的神經網絡。數周后&#xff0c;一…

Kubernetes自動擴縮容方案對比與實踐指南

Kubernetes自動擴縮容方案對比與實踐指南 隨著微服務架構和容器化的廣泛采用&#xff0c;Kubernetes 自動擴縮容&#xff08;Autoscaling&#xff09;成為保障生產環境性能穩定與資源高效利用的關鍵技術。面對水平 Pod 擴縮容、垂直資源調整、集群節點擴縮容以及事件驅動擴縮容…

【CVPR2025】計算機視覺|SIREN: 元學習賦能!突破INR高分辨率圖像分類難題

論文地址&#xff1a;https://arxiv.org/pdf/2503.18123v1 代碼地址&#xff1a;https://github.com/SanderGielisse/MWT 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 …

牛客周賽 Round 99

賽時成績如下&#xff1a;A. Round 99題目描述 對于給定的五位整數&#xff0c;檢查其中是否含有數字 99&#xff1b;換句話說&#xff0c;檢查是否存在相鄰的兩個數位&#xff0c;其值均為 。解題思路&#xff1a; 檢查相鄰的兩個數字是否均為9#include <bits/stdc.h> u…

從0到1搭建個人技術博客:用GitHub Pages+Hexo實現

一、為什么要搭建個人技術博客&#xff1f; 在技術圈&#xff0c;擁有個人博客的好處不言而喻&#xff1a; 簡歷加分項&#xff1a;面試官更青睞有技術沉淀的候選人知識系統化&#xff1a;輸出倒逼輸入&#xff0c;加深技術理解人脈拓展&#xff1a;吸引同行關注&#xff0c;…

Ubuntu22.04 設置顯示存在雙屏卻無法雙屏顯示

文章目錄一、背景描述二、解決方法一、背景描述 回到工位后&#xff0c;發現昨天離開時還可正常顯示的雙屏&#xff0c;今早ubuntu22.04 的設置界面顯示有雙屏&#xff0c;但外接的顯示屏無法正常顯示。 首先&#xff0c;查看當前圖像處理顯卡是否為N卡&#xff0c;沒錯&#…

高亞科技簽約奕源金屬,助力打造高效智能化采購管理體系

深圳市奕源金屬制品有限公司近日&#xff0c;國內企業管理軟件服務商高亞科技與深圳市奕源金屬制品有限公司&#xff08;以下簡稱“奕源金屬”&#xff09;正式簽約&#xff0c;雙方將基于高亞科技自主研發的8Manage SRM采購管理系統&#xff0c;共同推動奕源金屬采購管理的數字…