如何实现Python脚本运行时自动安装依赖(含Selenium)
当然可以实现!
这其实是Python自动化脚本分发里非常实用的需求,我来给你分享几个靠谱的实现思路,让分析师双击就能跑,完全不用手动折腾依赖:
方法1:脚本开头自动检查并安装依赖
直接在脚本最开头加一段代码,先尝试导入需要的库,如果导入失败,就自动调用pip安装。这种方式简单直接,不需要额外的配置文件。
示例代码如下:
import sys import subprocess # 定义需要安装的依赖列表 REQUIRED_PACKAGES = ["selenium", "webdriver-manager"] def install_packages(packages): for package in packages: try: __import__(package.split("==")[0]) # 忽略版本号,只检查包是否存在 print(f"{package} 已安装,跳过...") except ImportError: print(f"正在安装 {package}...") subprocess.run( [sys.executable, "-m", "pip", "install", package], check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) print(f"{package} 安装完成!") # 先执行依赖安装 install_packages(REQUIRED_PACKAGES) # 下面是你的核心业务代码 from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager def create_change_ticket(): # 用webdriver-manager自动获取对应版本的Chrome驱动 driver = webdriver.Chrome(ChromeDriverManager().install()) # 这里写你的工单创建逻辑,比如打开系统页面、填写表单等 driver.get("你的变更控制系统URL") # ... 其他操作 ... driver.quit() if __name__ == "__main__": try: create_change_ticket() print("工单创建流程执行完成!") except Exception as e: print(f"执行出错:{str(e)}") # 防止双击运行时窗口直接闪退 input("\n按回车键退出...")
关键细节说明
- 用
sys.executable调用pip:确保使用的是当前脚本对应的Python解释器,避免多Python版本环境下装错地方。 - 加入
webdriver-manager:Selenium需要对应浏览器的驱动(比如ChromeDriver),这个库能自动检测浏览器版本并下载匹配的驱动,完全不用用户手动下载配置,大幅降低使用门槛。 - 末尾的
input():Windows下双击.py文件运行时,执行完会直接关闭命令行窗口,加这个能让用户看到执行结果,不会一脸懵。
方法2:配合requirements.txt批量安装
如果依赖比较多,或者需要固定版本,可以把依赖写在requirements.txt里,然后脚本里读取这个文件批量安装。
比如requirements.txt内容:
selenium==4.15.0 webdriver-manager==4.0.1
然后脚本里的安装逻辑改成:
def install_from_requirements(): try: with open("requirements.txt", "r") as f: packages = [line.strip() for line in f if line.strip() and not line.startswith("#")] subprocess.run( [sys.executable, "-m", "pip", "install", "-r", "requirements.txt"], check=True ) print("所有依赖安装完成!") except FileNotFoundError: print("未找到requirements.txt文件,请检查路径!")
这种方式更适合依赖复杂的场景,方便统一管理版本。
不管用哪种方法,只要分析师的电脑上预先装了Python,双击脚本就能自动搞定所有依赖,直接运行核心逻辑,完全不用他们懂命令行或者Python环境配置~
内容的提问来源于stack exchange,提问作者ipenguin67




