【问题标题】:Creating requirements.txt in pip compatible format in a conda virtual environment在 conda 虚拟环境中以 pip 兼容格式创建 requirements.txt
【发布时间】:2021-02-06 12:55:52
【问题描述】:

我在 Windows 10 PC 上创建了一个 conda 虚拟环境来处理一个项目。为了安装所需的包和依赖项,我使用conda install <package> 而不是pip install <package>,按照https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#using-pip-in-an-environment 中提到的最佳实践

为了分发我的软件,我选择分别针对 conda 和非 conda 用户创建一个 environment.yml 和一个 requirements.txt 文件。我能够将当前的虚拟环境导出到一个 yml 文件中,因此 conda 用户得到了照顾。但是,为了让非 conda 用户能够复制相同的环境,我需要创建和共享 requirements.txt 文件。可以使用conda list --export > requirements.txt 创建此文件,但此格式与 pip 不兼容,其他用户无法在其系统上使用pip install -r requirements.txt

使用pip freeze > requiremens.txtherehere 提到的解决方案。这意味着非 conda 用户可以在没有 conda 的情况下使用 virtualenv 创建的虚拟环境中简单地执行 pip install -r requirements.txt

但是,如果您以上述样式生成 requiremets.txt 文件,您最终会得到一个包含符号链接的 requirements.txt 文件。这是因为我们试图为使用conda install 而不是pip install 安装的软件包创建一个 requirements.txt 文件。 例如,我以类似方式生成的 requirements.txt 文件如下所示。

certifi==2020.6.20
cycler==0.10.0
kiwisolver==1.2.0
matplotlib @ file:///C:/ci/matplotlib-base_1603355780617/work
mkl-fft==1.2.0
mkl-random==1.1.1
mkl-service==2.3.0
numpy @ file:///C:/ci/numpy_and_numpy_base_1596215850360/work
olefile==0.46
pandas @ file:///C:/ci/pandas_1602083338010/work
Pillow @ file:///C:/ci/pillow_1602770972588/work
pyparsing==2.4.7
python-dateutil==2.8.1
pytz==2020.1
sip==4.19.13
six==1.15.0
tornado==6.0.4
wincertstore==0.2

使用该文件安装依赖时,这些符号链接会导致错误。

我采取的步骤使我找到了上述 requirements.txt 文件:

  1. 使用conda create -n myenv python=3.8 创建了一个新的 conda 虚拟环境
  2. 使用conda activate myenv激活了新创建的conda虚拟环境
  3. 使用conda install pip 安装了pip
  4. 使用conda intall pandas 安装了pandas
  5. 使用conda install matplotlib 安装了matplotlib
  6. 使用pip freeze > requirements.txt生成了一个pip兼容的requrements.txt文件

那么,我的问题是,您如何坚持使用 conda install 而不是 pip install 的最佳做法,同时仍然能够将您的软件包分发给 conda 和非 conda 用户?

【问题讨论】:

    标签: python pip conda requirements.txt


    【解决方案1】:

    我为上述问题找到的最佳解决方案是我将在下面描述的组合。对于conda,我会首先将环境列表导出为environment.yml,并省略软件包内部版本号,这通常是难以在另一个操作系统上重现环境的原因:

    conda env export > environment.yml --no-builds
    

    输出:

    name: myenv
    channels:
      - defaults
      - conda-forge
    dependencies:
      - blas=1.0
      - ca-certificates=2020.10.14
      - certifi=2020.6.20
    ...
    

    对于pip,您上面描述的显然是最近版本的pip 中的well-known issue。获得“干净”requirements.txt 文件的解决方法是这样导出:

    pip list --format=freeze > requirements.txt
    

    输出:

    certifi==2020.6.20
    cycler==0.10.0
    kiwisolver==1.2.0
    matplotlib==3.3.2
    mkl-fft==1.2.0
    ...
    

    请注意,pipconda 之间的上述内容不同,这很可能是因为 condapip 更通用,并且不仅包括 Python 包。

    就我个人而言,我发现对于分发一个包,通过检查你的代码(你做了什么导入?)来确定所需的最小包集及其版本可能更简洁,而不是盲目地导出完整的@ 987654335@ 或 conda 列表,最终可能会(意外或无意)包括使用该软件包并非真正需要的软件包。

    【讨论】:

    • 感谢您的回答! @塔尼亚。使用 --format=freeze 标志创建的 requirements.txt 确实是干净的版本,即没有符号链接。答案也有助于理解两者之间的差异以及在这种情况下需要考虑的关键事项。
    • @tania 我写了一个包,它和你最后描述的一样。 anaconda.org/jamespreed/conda-minify 它使用有向无环图来查找所有其他包可以作为依赖关系派生的顶级包。
    • @James 太棒了! :D 一定会检查出来的。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2021-11-06
    相关资源
    最近更新 更多