| |
| import argparse |
| import os |
| import shutil |
| import sys |
| from pathlib import Path |
| from typing import Optional |
|
|
| from webdriver_manager.chrome import ChromeDriverManager |
|
|
|
|
| def resolve_target_path(dest: str) -> Path: |
| p = Path(dest) |
| if p.exists() and p.is_dir(): |
| name = "chromedriver.exe" if sys.platform.startswith("win") else "chromedriver" |
| return p / name |
| if dest.endswith(os.sep): |
| name = "chromedriver.exe" if sys.platform.startswith("win") else "chromedriver" |
| return Path(dest) / name |
| return p |
|
|
|
|
| def install(dest: Optional[str]) -> Path: |
| print( |
| "[提示] ChromeDriverManager 下载可能需要代理。如果失败,请查看 docs/chromedriver_installation.md 以手动安装。" |
| ) |
| src_path = ChromeDriverManager().install() |
| print(f"[完成] 已下载: {src_path}") |
| if dest: |
| target = resolve_target_path(dest) |
| target.parent.mkdir(parents=True, exist_ok=True) |
| shutil.move(src_path, target) |
| try: |
| mode = os.stat(target).st_mode |
| os.chmod(target, mode | 0o111) |
| except Exception as e: |
| print(f"[警告] 设置可执行权限失败: {e}") |
| print(f"[完成] 已移动到: {target}") |
| return target |
| else: |
| print(f"[信息] 使用默认安装位置: {src_path}") |
| return Path(src_path) |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser( |
| prog="auto_install_chromedriver", |
| description=( |
| "自动下载 ChromeDriver。可选指定目标路径,若未指定则保留在默认位置。" |
| ), |
| ) |
| parser.add_argument( |
| "-d", |
| "--dest", |
| type=str, |
| default=None, |
| help="目标 chromedriver 路径或目录。可传目录或完整文件路径。", |
| ) |
| args = parser.parse_args() |
| target = install(args.dest) |
| print(f"[结果] chromedriver 位置: {target}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|