在 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 文件:
- 使用
conda create -n myenv python=3.8
创建了一个新的 conda 虚拟环境
- 使用
conda activate myenv
激活了新创建的 conda 虚拟环境
- 使用
conda install pip
安装了 pip
- 使用
conda intall pandas
安装 pandas
- 使用
conda install matplotlib
安装了 matplotlib
- 使用
pip freeze > requirements.txt
生成了一个 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
...
请注意,以上内容在 pip
和 conda
之间是不同的,这很可能是因为 conda
比 pip
更通用并且不仅包括 Python 包。
就我个人而言,我发现对于分发包,通过检查您的代码(您导入了什么?)来确定所需的最小包集及其版本可能更简洁,而不是盲目地导出完整的 pip
或 conda
列表,最终可能会(无意或无意地)包含使用该包并非真正必需的包。
我在 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
是提到的解决方案 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 文件:
- 使用
conda create -n myenv python=3.8
创建了一个新的 conda 虚拟环境
- 使用
conda activate myenv
激活了新创建的 conda 虚拟环境
- 使用
conda install pip
安装了 pip
- 使用
conda intall pandas
安装 pandas
- 使用
conda install matplotlib
安装了 matplotlib
- 使用
pip freeze > requirements.txt
生成了一个 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
...
请注意,以上内容在 pip
和 conda
之间是不同的,这很可能是因为 conda
比 pip
更通用并且不仅包括 Python 包。
就我个人而言,我发现对于分发包,通过检查您的代码(您导入了什么?)来确定所需的最小包集及其版本可能更简洁,而不是盲目地导出完整的 pip
或 conda
列表,最终可能会(无意或无意地)包含使用该包并非真正必需的包。