You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:编写可复用Python包下载脚本(仅下载包及依赖不安装)

纯Python实现包下载器的实用方案

当然有合适的方案!你完全可以用纯Python代码实现只下载指定包及其依赖的功能,不用调用外部pip命令。我给你梳理几个最实用的思路:

方案一:直接调用pip的内部API

pip本身就是Python写的,你可以直接用它的内部下载逻辑来完成需求。虽然官方不推荐依赖内部API,但对于这种场景来说,这是最快捷的方式——不用额外安装任何第三方库。

下面是一个可复用的示例脚本,能把指定包和所有依赖下载到你指定的目录:

from pip._internal.commands.download import DownloadCommand
from pip._internal.cli.main_parser import parse_command

def download_package(package_spec, dest_dir):
    """
    下载指定Python包及其依赖到目标目录
    :param package_spec: 包名,支持版本约束,比如"requests>=2.20.0"
    :param dest_dir: 下载文件的存储目录
    """
    # 解析pip download命令的参数
    args = parse_command(["download", "--dest", dest_dir, package_spec])[1]
    # 执行下载命令
    cmd = DownloadCommand()
    cmd.run(args)

if __name__ == "__main__":
    # 示例:下载requests 2.31.0及以上版本到./downloaded_packages目录
    download_package("requests>=2.31.0", "./downloaded_packages")

注意:pip的内部API可能随版本迭代有小改动,建议在你目标运行环境的pip版本下测试脚本,必要时固定pip版本来保证兼容性。

方案二:使用pip-tools实现稳定下载

如果你想要更稳定、官方支持的接口,pip-tools是个绝佳选择。它是pip官方推出的辅助工具,专门用来处理依赖解析和包下载,API设计更面向外部开发者,不用担心pip版本更新导致的兼容问题。

首先你需要先安装pip-tools(用pip安装即可,这是一次性的操作):

pip install pip-tools

然后就可以用它的pip-download模块来编写下载脚本:

from pip_download import download

def download_with_pip_tools(package_specs, dest_dir):
    """
    下载一个或多个包及其依赖到目标目录
    :param package_specs: 包名列表,比如["requests", "flask==2.3.3"]
    :param dest_dir: 下载文件的存储目录
    """
    download(package_specs, dest_dir)

if __name__ == "__main__":
    # 示例:同时下载requests和指定版本的flask
    download_with_pip_tools(["requests", "flask==2.3.3"], "./downloaded_packages")

这个方案的优势在于稳定性,pip-tools会处理好依赖解析、版本冲突等细节,比直接用pip内部API更可靠。

方案三:手动实现依赖解析与下载(不推荐)

如果你完全不想依赖任何外部工具(包括pip),也可以手动从PyPI获取包的元数据,解析依赖链,然后下载对应的wheel或源码包。但这种方式需要处理大量细节:比如版本约束校验、平台兼容性匹配、递归解析依赖等,工作量非常大,除非有特殊的隔离需求,否则不推荐这么做。

总结一下:如果你追求快速实现,选方案一;如果想要长期稳定的可复用性,选方案二。

内容的提问来源于stack exchange,提问作者user3683131

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:10:21