我们现在需要将某个环境已经安装的 python 包离线传递到另外一个环境,且确保这种安装行为最终不需要对 PYPI 中央仓库的有效连接,也能完成。下面给出两种办法:

docker container

如果你的 python 环境位于某个容器内,那最好的办法就是执行docker commit操作构建镜像:

docker commit <容器id> <自定义的镜像名称>:<tag>

比如

docker commit 123 456:78

tag不是必须的,若没有指定,默认为latest。容器id可以通过docker ps 获取:

123 456 "789"               11 minutes ago      Up 11 minutes                                 0123   

其中的123就是容器id

执行docker commit成功构建镜像以后,就可以用docker save保存镜像:

docker save -o <tar包名称>.tar <自定义的镜像名称>:<tag>

这一步可能存在交换分区不足,导致无法保存镜像的问题,报错如下:

Error response from daemon: write layer.tar: no space left on device

可以通过以下命令获取docker交换空间的地址:

docker info | grep "Docker Root Dir"

至于空间不足,无外乎删一点东西,或者重定向到其他位置,或者修改 docker 的配置。 这些修改大部分需要重启 docker 进程,在生产环境下慎用。另外也可以在参数中指定中间位置,但是仅限高版本的 docker

转移 python 包

如果你不是在容器环境内,那操作可以复杂一点。

导出

首先需要导出 python 包的清单文件(requirements.txt):

pip freeze > requirements.txt

根据清单文件在源环境下载包到本地:

pip download -r requirements.txt -d python-pkgs/ --no-deps

下载的包有whl文件,也有压缩包,这是正常现象。

源环境已经安装的包,有可能会互相冲突。也就是源环境的pip生态有可能已经依赖不自恰了。

我们需要先去掉清单文件的版本号,反正仅限本地目录安装,也装不了别的版本。但根本目的是让pip无法针对版本号进行依赖性检查:

import argparse
import re
from pathlib import Pathdef remove_version_specifiers(input_file, output_file=None, inplace=False):"""从requirements文件中移除所有包的版本约束参数:input_file (str): 输入的requirements文件路径output_file (str): 输出文件路径,默认为None(与输入文件同名但添加-cleaned后缀)inplace (bool): 是否直接在原文件上修改"""# 读取文件内容with open(input_file, 'r', encoding='utf-8') as f:lines = f.readlines()# 定义正则表达式模式,匹配包名和版本约束pattern = re.compile(r'^([^\s!=<>#]+)([!=<>].*)?$')cleaned_lines = []for line in lines:line = line.strip()# 跳过空行和注释if not line or line.startswith('#'):cleaned_lines.append(line + '\n')continue# 处理带有注释的行if '#' in line:code_part, comment_part = line.split('#', 1)code_part = code_part.strip()comment_part = '#' + comment_partelse:code_part = linecomment_part = ''# 移除版本约束match = pattern.match(code_part)if match:package_name = match.group(1)cleaned_lines.append(f"{package_name}{comment_part}\n")else:# 如果不匹配标准格式,保留原样cleaned_lines.append(f"{line}\n")# 确定输出文件路径if inplace:output_path = input_fileelif output_file:output_path = output_fileelse:input_path = Path(input_file)output_path = input_path.with_name(f"{input_path.stem}-cleaned{input_path.suffix}")# 写入清理后的内容with open(output_path, 'w', encoding='utf-8') as f:f.writelines(cleaned_lines)print(f"已成功清理文件: {input_file}{output_path}")return output_pathif __name__ == "__main__":parser = argparse.ArgumentParser(description='移除requirements文件中的版本约束')parser.add_argument('input_file', help='输入的requirements文件路径')parser.add_argument('-o', '--output', help='输出文件路径,默认为输入文件名添加-cleaned后缀')parser.add_argument('-i', '--inplace', action='store_true', help='直接在原文件上修改')args = parser.parse_args()try:remove_version_specifiers(args.input_file, args.output, args.inplace)except Exception as e:print(f"处理文件时出错: {e}")    

现在就可以将清单文件和包一起复制到目标环境了。

导入

如果目标环境有已经安装的python包,需要全卸载掉,防止和从源环境导入的冲突。

在目标环境导出清单文件:

pip freeze > u-requirements.txt

然后卸载掉全部的依赖:

pip uninstall -r u-requirements.txt -y

此时将之前复制过来的离线文件全部安装即可:

pip install --no-index --find-links=python-pkgs/ -r requirements-cleaned.txt --only-binary=:none: --no-build-isolation --no-deps

--no-index--find-links=python-pkgs/的组合,可以让pip只从本地的目录里获取要安装的包。
--no-deps会使 pip 在安装软件包时,不安装它所依赖的其他包。也就是说,只会安装requirements-cleaned.txt文件里直接列出的软件包。这是为了防止在安装的时候出现依赖冲突。
--no-build-isolation:正常情况下,pip 在构建软件包时会创建一个隔离的环境。而使用这个参数后,就不会创建隔离环境,构建过程会依赖当前环境里已有的依赖项。这是防止 pip 无法检测到本地已经安装的setup-tools
--only-binary=:none::这个参数表明不使用预编译的二进制包(像.whl 文件)进行安装.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917359.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917359.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917359.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TGD第十篇:当神经网络遇到TGD特征

目录一、实验背景二、实验设置三、实验结果和分析四、结语TGD 是我们定义的一种新的“变化率表征”&#xff0c;对连续函数而言是一种新的“广义导数”&#xff0c;对离散序列而言是一种新的差分。TGD 是一个名字&#xff0c;一个代号。在基于 TGD 的图像边缘检测以及视频边缘检…

FreeRTOS源码分析二:task启动(RISCV架构)

系列文章目录 FreeRTOS源码分析一&#xff1a;task创建&#xff08;RISCV架构&#xff09; 文章目录系列文章目录前言vTaskStartScheduler 调度器启动函数xPortStartScheduler架构特定调度器启动函数vPortSetupTimerInterrupt启动 RISCV 定时器中断xPortStartFirstTask启动第一…

Python编程基础与实践:Python基础运算符与表达式入门

Python运算符与表达式实战 学习目标 通过本课程的学习&#xff0c;学员可以掌握Python中算术运算符、比较运算符、逻辑运算符及赋值运算符的使用方法&#xff0c;并能够构建简单的表达式来解决实际问题。 相关知识点 Python运算符与表达式 学习内容 1 Python运算符与表达式 1.1…

Git下载全攻略(未更新完)

一、在 Windows 上安装 Git​ ​​​ 1.1 下载安装包​ 官方版本可在 Git 官方网站下载,打开Redirecting…,下载会自动开始。此安装包来自名为 Git for Windows 的项目(也称作 msysGit),它与 Git 本身是相互独立的项目,更多相关信息可访问Redirecting Git for Windows…

rocky\centos安装docker镜像的命令

1.安装依赖&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm22. 选择仓库源&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里源&#xff1a; sudo yum-config-manager --add-r…

扣子,正式拥抱开源!

资料来源&#xff1a;火山引擎-开发者社区 扣子 是新一代 AI Agent 平台&#xff0c;旗下有四款子产品&#xff1a;「扣子空间」、「扣子开发平台」、「扣子罗盘」 及 Eino 。 我们始终坚信&#xff0c;AI Agent 的未来属于每一位开发者和创造者。为了让前沿的 AI 技术能够更快…

Git 各场景使用方法总结

以下是对 Git 各场景使用方法的全面总结,涵盖 20+ 核心场景和 100+ 命令,包含详细参数、使用示例及原理说明: 一、基础操作场景 1. 仓库初始化 # 本地初始化 git init git init --bare # 创建裸仓库(无工作区) git init -b main # 指…

国际标准组织共聚,智源推动全球AI开源与国际标准双轮驱动人工智能普惠化发展

7 月 26 日&#xff0c;人工智能标准化国际合作论坛在上海召开。该论坛由联合国工业发展组织全球工业人工智能联盟卓越中心主办&#xff0c;中国电子技术标准化研究院、上海人工智能研究院承办&#xff0c;工业和信息化部副部长单忠德、国家市场监督管理总局标准创新管理司司长…

《安富莱嵌入式周报》第356期:H7-TOOL的250M示波器模组批量生产中,自主开发QDD执行器,开源14bit任意波形发生器(2025-07-28)

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版 《安富莱嵌入式周报》第356期&#xff1a;H7-TOOL的250M示波器模组批量生产中&#xff0c;自主开发QDD执行器&a…

大模型学习专栏-导航页

概要 本专栏是小编系统性调研大模型过程中沉淀的知识结晶&#xff0c;涵盖技术原理、实践应用、前沿动态等多维度内容。为助力读者高效学习&#xff0c;特整理此导航页&#xff0c;以清晰脉络串联核心知识点&#xff0c;搭建起系统的大模型学习框架&#xff0c;助您循序渐进掌握…

leetcode热题——组合

组合题目描述给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ]示例 2&#xff1a; 输入&#xff1a;…

暑期算法训练.13

目录 57 力扣14最长公共前缀 57.1 题目解析&#xff1a; 57.2 算法思路 57.3 代码演示&#xff1a; ​编辑 57.4 总结反思&#xff1a; 58 力扣 5最长回文字符串 58.1 题目解析&#xff1a; ​编辑 58.2 算法思路&#xff1a; 58.3 代码演示&#xff1a; ​编辑 …

四、Portainer图形化管理实战与Docker镜像原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年8月2日 专栏&#xff1a;Docker教程 一、Portainer 安装与基础使用教程 Portainer 是一个轻量级、功能强大的Docker图形化管理界面 (GUI)。它能让你通过简单的Web界面来管理和监控你的Docker容器、镜像、卷、网络等资源&…

网络爬虫(python)入门

一、网络爬虫介绍 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动抓取互联网信息的程序&#xff0c;它能够高效地从海量网页中提取有价值的数据。作为数据采集的利器&#xff0c;爬虫技术在数据分析、搜索引擎、价格监控等领域有着广泛应用。本文将带你全面了解Pytho…

如何解决pip安装报错ModuleNotFoundError: No module named ‘plotnine’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘plotnine’问题 一、摘要 在使用 PyCharm 进行 Python 开发时&#xff0c;常常需要通过 pip install 安装第三方包。某天&#xff0c;你在终端或 PyCharm 控制…

语校网收录东京语言学校150所:数据结构建模与工程实现全解

语校网收录东京语言学校150所&#xff1a;数据结构建模与工程实现全解 一、为什么语言学校的信息抓取如此困难&#xff1f; 在日语教育领域&#xff0c;“语言学校”是一类极度碎片化的机构体系&#xff0c;尤其在东京地区&#xff0c;2025年时点上已合法设立的语言学校已超1…

【按下电源键后,电脑里发生了什么?——BIOS:启动世界的“第一把钥匙”】

当你按下电源键的瞬间&#xff0c;电脑从一片死寂中“苏醒”。但你是否想过&#xff1a;是什么让屏幕亮起、风扇转动、硬件逐一激活&#xff1f; 这背后&#xff0c;有一个隐藏在主板上的“小程序”在默默掌控全局——它就是 BIOS&#xff08;Basic Input/Output System&#x…

局域网五子棋工具 多人对战无限制

软件介绍 今天推荐一款经典的PC端五子棋游戏——GoBang&#xff0c;绿色免安装版本&#xff0c;完全免费&#xff0c;即开即用&#xff0c;轻松享受对弈乐趣。 游戏模式 软件提供三种对战模式&#xff1a;人人对战、人机对抗以及局域网联机游戏&#xff0c;满足不同玩家的社…

分布式弹幕系统设计

需求:分布式弹幕广播分布式方案1:适用redis 发布订阅来进行不同ws服务器之间的通信优点:适用小系统方案2:对ws服务器进行一致性hash获取ws服务的接入点优点:大型系统缺点:视频连接不均匀挑战点:广播速度聚合广播和线程池来进行优化

梦幻花瓣雨

1. 花瓣设计四种花瓣类型&#xff1a;创建了四种不同形状和颜色的花瓣&#xff08;粉红、淡紫、浅粉和蓝绿色&#xff09;自然形态&#xff1a;使用CSS渐变和复杂边框半径模拟真实花瓣的不规则形状柔和阴影&#xff1a;为花瓣添加微妙的阴影增强立体感2. 动画效果物理模拟&…