繁体   English   中英

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

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

我在 Windows 10 PC 上创建了一个 conda 虚拟环境来处理一个项目。 为了安装所需的包和依赖项,我使用conda install <package>而不是pip install <package>按照https://docs.conda.io/projects/conda/en/latest/user-中提到的最佳实践指南/任务/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.txt此处此处提到的解决方案。 这意味着非 conda 用户可以在没有 conda 的情况下使用 virtualenv 创建的虚拟环境中简单地执行pip install -r requirements.txt

但是,如果您生成上述样式的 requiremets.txt 文件,您最终会得到一个包含符号链接的 requirements.txt 文件。 这是因为我们尝试为使用 conda 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
  4. 使用 conda intall pandas conda intall pandas
  5. 使用conda install matplotlib
  6. 使用pip freeze > requirements.txt生成了与 pip 兼容的 requrements.txt 文件

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

我为上述问题找到的最佳解决方案是我将在下面描述的组合。 对于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 中的一个众所周知的问题 获得“干净”的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列表,这可能最终(意外或非偶然)包含使用该包并不是真正必要的包。

在您 bash shell 上,您可以简单地运行condo list | awk {'print $1'} |sed '/#/d;/_/d'> requirements.txt condo list | awk {'print $1'} |sed '/#/d;/_/d'> requirements.txt

在上面的代码中,我只是获取依赖项名称并从文件中删除#_ 这可以作为 bash 脚本运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM