<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Pip on aiken&#39;s blog</title>
    <link>https://aikenh.cn/tags/pip/</link>
    <description>Recent content in Pip on aiken&#39;s blog</description>
    <generator>Hugo -- 0.137.0</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 06 Mar 2023 11:27:52 +0000</lastBuildDate>
    <follow_challenge>
      <feedId>90080597450814464</feedId>
      <userId>72439538841050112</userId>
    </follow_challenge>
    <atom:link href="https://aikenh.cn/tags/pip/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Python00 Conda 与 Pip</title>
      <link>https://aikenh.cn/posts/python_pack_manager/</link>
      <pubDate>Mon, 06 Mar 2023 11:27:52 +0000</pubDate>
      <guid>https://aikenh.cn/posts/python_pack_manager/</guid>
      <description>manager python env for development.</description>
      <content:encoded><![CDATA[<p>@Aikenhong 的旧笔记翻新完善 1.0</p>
<p>Python 的灵活和广泛应用场景来自于众多的第三方库，由于强大的可拓展性和众多的库，使得 Python 的使用简单灵活，且应用面极广。</p>
<p>但是不同库之间的相互依赖关系，对版本的不同要求等等因素，使得&quot;环境配置&quot;成为了开发者闻之变色的一词，对一个新的库和项目环境的配置尝尝会花去大量的时间，这可能也是 Docker、Venv（虚拟环境）必须存在的原因之一。</p>
<blockquote>
<p>这里不对 Docker 及其相关技术，进行说明，会另开章节进行学习。</p>
</blockquote>
<p>才疏学浅的本菜鸡希望从 python 开发者避不开的 conda 和 pip 出发介绍一下关于库安装的一些事情，以及这两个 CLI 的关系。</p>
<h2 id="anaconda-miniconda-和-conda">Anaconda MiniConda 和 Conda</h2>
<p>anaconda 是一个针对数据科学的 Python 发行版，其包含了一下三个方面的内容：</p>
<ul>
<li>完整的 python，ipython</li>
<li>numpy、Script 等常用的数据科学库</li>
<li>包管理器 Conda 和 pip</li>
</ul>
<blockquote>
<p>软件发行版是在系统上提前编译和配置好的软件包集合， 装好了后就可以直接用</p>
</blockquote>
<p>miniconda 是 conda 的发行版，其包含了 conda 本体和其所需的所有环境，安装了 miniconda 后就可以正常使用 conda，由于其不包含 python 和诸多第三方包，所以会比 anaconda 纯净得多，我们可以基于其从零开始搭建一个完整的环境。</p>
<p>而 conda 只是一个包（lib、package）和环境（env）的管理工具，其用于自动安装，升级，（也可分析包之间的相互依赖关系）的工具。</p>
<h2 id="conda-和-pip-的关联和区别">Conda 和 Pip 的关联和区别</h2>
<p><strong>conda</strong> 是通用（语言无关且跨平台）的包管理器，它发源于 python 的 pydata 社区，但他不仅适用于 python 包的管理，还适用于任何语言写的包和依赖，但是我们应该大多数时候只用来做 python 管理。</p>
<ul>
<li>其只能在 conda 环境中安装包，但是可以安装各种语言和各种类型的包。</li>
</ul>
<p><strong>pip</strong>（pip install package） 是 python 官方认证的 python 包通用管理器，只能管理 python 包，安装发布于 python package index（pypi）上的所有包，均由 python 官方管理。</p>
<ul>
<li>其支持所有平台，但是只能安装 python 包</li>
</ul>
<p>接下来从一些重要的特性来讲述两者的区别和联系。</p>
<h3 id="虚拟环境支持对比">虚拟环境支持对比</h3>
<p>上述提到，我们希望有一个纯净的开发环境，在配置环境的时候出现诸多冲突，例如：</p>
<blockquote>
<p>PackageA 需要 PackageC&gt;3.11，而 PackageB 需要 PackageC&lt;3.10 导致运行起来冲突，或者无法安装的情况。</p>
</blockquote>
<p>因此我们希望能将每个开发环境隔离起来，项目 A、B、C 有分离的 python 版本和对应的一些 python 库。（这里我把环境简单的理解为 python+python 安装的所有 Package ）</p>
<p>而通过 pip 和 conda 都能在不同程度上，实现以上的需求，conda 原生支持虚拟环境管理，pip 则是需要借助 venv 或者 virtualenv 库来支持。参考：[pip 与 conda 的区别] ( <a href="https://zhuanlan.zhihu.com/p/379321816" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/379321816</a>
 )</p>
<table>
  <thead>
      <tr>
          <th>CLI</th>
          <th>Python 版本独立</th>
          <th>Python 依赖（lib）独立</th>
          <th>非 Python 的其他依赖管理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Conda</td>
          <td>y</td>
          <td>y</td>
          <td>y</td>
      </tr>
      <tr>
          <td>Pip+vir*</td>
          <td>n</td>
          <td>y</td>
          <td>y</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p>python 版本独立的意思是，不同环境之间是不是可以安装不同的 python，pip 只能将依赖分离，而对应的 python 都是同一个。</p>
</blockquote>
<p>可以看出在于包管理上，conda 还是更具优势，主要是因为其本身不需要依赖于某个既有的 python，不需要和该 Python 建立连接，没有沾亲带故的就更铁面无私嘛。具体可以参考上面的链接。</p>
<h3 id="包管理逻辑对比">包管理逻辑对比</h3>
<p>基于上述说明，开发一个 python 项目，我们可以优先创建一个虚拟环境，再在其中安装需要的依赖，这样能保证每一个环境的纯净，也能减少一些不必要的麻烦，也就是说，创建完环境的下一步，就是需要安装和管理每个环境中的包了。</p>
<table>
  <thead>
      <tr>
          <th>CLI</th>
          <th>Source</th>
          <th>依赖校验</th>
          <th>是否需要换源加速/代理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Conda</td>
          <td>Anaconda &amp; Cloud</td>
          <td>auto(且支持非 python 的依赖)</td>
          <td>狗头</td>
      </tr>
      <tr>
          <td>Pip</td>
          <td>Pypi</td>
          <td>自动检查、手动选择是否</td>
          <td>狗头</td>
      </tr>
  </tbody>
</table>
<p>从上述简单的对比可以看出，两者安装 package 的源不同，这样有以下的两个影响：</p>
<ol>
<li>Conda 最好是添加一些常用的 Channel，添加其软件来源，方便使用 conda 进行包的安装；</li>
<li>即使倾向于使用 conda 做管理，还是会在开发中遇到需要混用 pip 的场景（蛮多） ，那么这样是否会有影响呢？下面我们从两个管理器的安装逻辑来说（结合虚拟环境）：</li>
</ol>
<p><strong>conda 安装包的逻辑</strong>是这样的：</p>
<p>基于 <code>conda install &lt;pkg&gt;</code> 安装的库都会放在 Anaconda 的 Pkgs 目录下统一存储，例如 windows 就是 <code>E:\anaconda\pkgs\&lt;pkg&gt;</code> ，通过这样的方式，当新的环境中需要一个某个环境中<strong>已经安装过的包</strong>的时候，就只需要把对应的文件复制到到新环境的 <code>lib\python&lt;*&gt;\site-packages</code> 目录中即可，无需重复下载。</p>
<blockquote>
<p>anaconda 中会对每个环境创建一个新的目录。而该环境的的库就是存在 <code>、env\&lt;env-name&gt;\lib\pythonxxx\site-packages</code> 路径下。</p>
</blockquote>
<p><strong>pip 安装包的逻辑</strong>是这样的：</p>
<p>基于 <code>pip install &lt;pkg&gt;</code> 安装的库会放在对应的就会放在 <code>xxx\pythonxxx\site-packages</code> 中。</p>
<p><strong>综上所述</strong>，（正常）混用的话基本上是没有影响的，还是能保证我们的环境进行分离，这是因为：</p>
<ul>
<li>当 conda 切换虚拟环境的时候，对应的 pip 也会进行切换，这样通过 pip 安装的包也会仅安装在当前环境的目录中，和 conda 进行安装是一致的</li>
</ul>
<p><strong>同时两者之间还有这样的交互关系：</strong></p>
<ul>
<li><code>conda list</code>  列出的包中，build 项目为 pypi 的即为 pip 安装的包。</li>
<li>卸载的时候两者是一致的： <code>conda uninstall &lt;pkg&gt;</code> 和 <code>pip uninstall &lt;pkg&gt;</code> 都只是讲当前环境中的库删除了，不会删除 conda 的 pkg 目录中的备份，如果要清空该已下载库，通过 <code>conda clean -h</code> 实现</li>
</ul>
<p>（need check）（<strong>not recommand</strong>）理解了这样的安装关系后，我们也可以知道如何为一个环境手动安装一个 package 了，在 pypi 上下载压缩包后，解压到对应的目录中，执行以下命令即可</p>
<div class="code-block">
    <div class="code-title" onclick="toggleCode(this)">
        
        <span class="code-block-open"><ion-icon name="chevron-down-outline"></ion-icon></span>
        <span class="code-block-close"><ion-icon name="chevron-forward-outline"></ion-icon></ion-icon></span>
        <span>shell</span>
    </div>
    <div class="code-content">
        
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">python setup.py install</span></span></code></pre></div>
    </div>
</div>

<script>
function toggleCode(element) {
    const codeContent = element.nextElementSibling;
    if (codeContent.style.display === "none" || codeContent.style.display === "") {
        codeContent.style.display = "block"; 
        codeContent.parentNode.classList.remove("code-has-hidden-child");
    } else {
        codeContent.style.display = "none"; 
        codeContent.parentNode.classList.add("code-has-hidden-child");
    }
}
</script><p>网络问题的话建议换源，还是不要手动安装。</p>
<h2 id="其他相关资料">其他相关资料</h2>
<h3 id="windows-conda-路径问题">windows conda 路径问题</h3>
<ol>
<li>在 windows 上安装 anaconda 之前，如果原本有 python，建议是删掉该 python 避免带来不必要的路径问题。</li>
<li>windows 上如果出现输入 python 跳转 win 商店的话，八成是系统路径中的问题，可以将 winstore 的路径往后挪。</li>
</ol>
<h3 id="pip-和-pip3">pip 和 pip3</h3>
<ul>
<li>python2 只能用 pip</li>
<li>python3 都可以用，如果仅有 python3，那么两者等价</li>
<li>如果装了 python2 和 python3，那么默认 pip 给 python2 用，pip3 给 python3 用，功能一样。</li>
<li>虚拟环境中，若只存在一个 python 版本，可以认为在用系统中 pip 和 pip3 命令都是相同的</li>
</ul>
<h3 id="pip-删除所有安装的包">pip 删除所有安装的包</h3>
<p><a href="https://www.qiniu.com/qfans/qnso-11248073" target="_blank" rel="noopener">删除pip安装的所有软件包的最简单方法是什么？ (qiniu.com)</a>
</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
