【python】轉移本地安裝的python包

我們現在需要將某個環境已經安裝的 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. 動畫效果物理模擬&…