无pip且无公网的生产/UAT环境如何获取Python应用所需依赖包
问题解答
关于是否可以直接复制Anaconda site-packages全部内容
- 不建议直接全量复制,存在几个核心问题:
- 体积冗余:全量复制会带上环境中所有安装过的无关库,数百MB的体积会大幅增加部署包的传输和部署成本
- 兼容性风险:如果开发环境和生产环境的Python版本、操作系统架构(比如开发为Windows、生产为Linux)、CPU指令集不一致,部分带二进制编译文件的库(比如numpy、pandas)直接复制过去会无法运行
- 路径依赖问题:部分库会硬编码安装时的路径,直接复制到其他目录可能出现加载失败
- 仅在开发和生产环境完全一致(操作系统、Python版本、架构100%匹配),且不介意体积的特殊场景下可以临时使用。
仅提取应用实际依赖的方法
下面提供两种可落地的方案:
方案1:pip导出依赖+离线下载(推荐,兼容性最好)
首先在有网络的开发环境操作:
- 先清理开发环境无关依赖,确保当前虚拟环境只安装了应用需要的库,导出依赖清单:
pip freeze > requirements.txt - 下载所有依赖的安装包到指定目录,如果生产环境和开发环境的架构/系统不同,需要添加参数指定目标环境(比如生产是Linux x86_64、Python3.9,就加
--platform manylinux_x86_64 --python-version 3.9 --only-binary :all:参数):pip download -r requirements.txt -d python-lib - 到无网的生产环境后,如果允许执行pip命令,直接从本地目录安装依赖:
pip install --no-index --find-links=python-lib -r requirements.txt
如果不允许执行pip安装,也可以直接把python-lib目录添加到Python的模块搜索路径中,在应用入口文件的最开头添加以下代码即可:import sys sys.path.insert(0, "./python-lib")
方案2:用工具扫描项目精确提取依赖
如果开发环境安装了很多无关库、不想单独新建虚拟环境,可以用pipreqs工具扫描项目代码,仅导出实际用到的依赖:
- 安装pipreqs:
pip install pipreqs - 扫描项目根目录生成依赖清单:
pipreqs /path/to/your/project --encoding=utf8 - 后续的依赖下载、部署步骤和方案1完全一致,这种方式生成的依赖清单只会包含代码实际import的库,体积会小很多。
注意:如果依赖库包含C扩展的二进制文件,一定要保证下载的包和生产环境的系统、Python版本、架构匹配,否则会出现导入报错。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

