求助:如何用Python实现第三方程序的下载、静默安装与验证?
Hey Sergei, great question—let's tackle each part of your task with concrete, actionable solutions that you can implement right away:
The most reliable way to get these details is to leverage official APIs or published download patterns (web scraping should be a last resort since it's fragile if the website changes). Here's a practical example for Google Chrome:
import requests def get_chrome_latest_details(): # Fetch the latest stable Chrome version via Google's official API version_api = "https://versionhistory.googleapis.com/v1/chrome/releases?filter=channel:stable&fields=releases/version" response = requests.get(version_api) latest_version = response.json()["releases"][0]["version"] # Construct the offline installer URL (64-bit enterprise MSI, which supports silent installs) # You can also use the version-specific URL if needed: # offline_url = f"https://dl.google.com/release2/chrome/{latest_version}_googlechromestandaloneenterprise64.msi" offline_url = "https://dl.google.com/tag/s/dl/chrome/install/googlechromestandaloneenterprise64.msi" return latest_version, offline_url # Usage chrome_version, chrome_offline_url = get_chrome_latest_details() print(f"Latest Chrome version: {chrome_version}") print(f"Offline installer URL: {chrome_offline_url}")
For other products:
- Look for official developer docs or API endpoints (e.g., Mozilla has an API for Firefox versions)
- If no API exists, check the download page's source code for hidden links or JavaScript that generates download URLs.
os.system os.system works, but the subprocess module is far more flexible—it lets you capture output, check return codes, and handle errors better. Here are two solid approaches:
Option 1: Using subprocess.run (Recommended)
import subprocess def silent_install(installer_path, args): try: # Execute the installer with silent arguments result = subprocess.run( [installer_path] + args, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print("Silent install completed successfully!") return True except subprocess.CalledProcessError as e: print(f"Install failed with error: {e.stderr}") return False # Example: Install Chrome MSI silently (no UI, no restart) silent_install("googlechromestandaloneenterprise64.msi", ["/qn", "/norestart"])
Option 2: MSI-Specific Command (for .msi installers)
For Windows Installer packages, you can use msiexec directly for more control:
subprocess.run( ["msiexec", "/i", "googlechromestandaloneenterprise64.msi", "/qn", "/norestart", "/log", "chrome_install.log"], check=True )
The /log flag creates a detailed log file to debug installation issues.
Parameters vary by installer type, but here are the most widely used ones:
EXE Installers
/s: Full silent mode (supported by Chrome, 7-Zip, and many others)/verysilent: Ultra-silent mode (used by Inno Setup-based installers—no progress bar, no prompts)/quiet: Microsoft-style silent mode (used by some Windows apps)/norestart: Prevent automatic system restart after installation/log "path/to/log.txt": Generate an installation log for debugging
MSI Installers
/qn: No UI, fully silent (most common for MSI packages)/qb: Basic UI (only shows a progress bar, no user input)/i: Trigger installation (required for MSI)/x: Trigger uninstallation/norestart: Avoid post-install restart/log "path/to/log.txt": Log installation events
Pro tip: Always check the product's official documentation for installer-specific parameters—some apps have unique flags (e.g., Chrome allows setting installation directory via INSTALLDIR).
You can validate installs using three reliable methods:
Method 1: Check Installed File & Version
Verify the main executable exists and matches the expected version:
import os import win32api # Install via pip install pywin32 def get_file_version(file_path): try: version_info = win32api.GetFileVersionInfo(file_path, "\\") ms = version_info["FileVersionMS"] ls = version_info["FileVersionLS"] return f"{win32api.HIWORD(ms)}.{win32api.LOWORD(ms)}.{win32api.HIWORD(ls)}.{win32api.LOWORD(ls)}" except Exception as e: print(f"Failed to get version: {e}") return None def verify_install(executable_path, expected_version): if not os.path.exists(executable_path): print("Program not installed!") return False installed_version = get_file_version(executable_path) if installed_version == expected_version: print(f"Install successful! Version matches: {installed_version}") return True else: print(f"Version mismatch: Expected {expected_version}, got {installed_version}") return False # Usage for Chrome verify_install("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", chrome_version)
Method 2: Check Registry Entries
Most Windows apps write installation details to the registry. For Chrome, you can check the uninstall entry:
import winreg def get_installed_version_from_registry(): try: key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key: version, _ = winreg.QueryValueEx(key, "DisplayVersion") return version except FileNotFoundError: print("Registry entry not found—program likely not installed.") return None except Exception as e: print(f"Registry read failed: {e}") return None
Method 3: Check Running Process
Start the program and verify its process is running (useful for quick checks, but less reliable than version validation):
import psutil # Install via pip install psutil def is_program_running(process_name): for proc in psutil.process_iter(["name"]): if proc.info["name"].lower() == process_name.lower(): return True return False # Check if Chrome is running is_program_running("chrome.exe")
内容的提问来源于stack exchange,提问作者Sergei Petrov

