在 conda 虚拟环境中以 pip 兼容格式创建 requirements.txt

Creating requirements.txt in pip compatible format in a conda virtual environment

我在 Windows 10 台 PC 上创建了一个 conda 虚拟环境来处理一个项目。为了安装所需的包和依赖项,我根据 https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#using-pip-in-an-environment

中提到的最佳实践使用 conda install <package> 而不是 pip install <package>

为了分发我的软件,我选择分别针对 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.txt 是提到的解决方案 and 。这意味着非 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
  2. 创建了一个新的 conda 虚拟环境
  3. 使用 conda activate myenv
  4. 激活了新创建的 conda 虚拟环境
  5. 使用 conda install pip
  6. 安装了 pip
  7. 使用 conda intall pandas
  8. 安装 pandas
  9. 使用 conda install matplotlib
  10. 安装了 matplotlib
  11. 使用 pip freeze > requirements.txt
  12. 生成了一个 pip 兼容的 requrements.txt 文件

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

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

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 包。

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