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

问题描述

我已经在Windows 10 PC上创建了一个conda虚拟环境以用于项目。根据{{​​3}}

中提到的最佳实践,要安装所需的软件包和依赖项,我使用的是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是提到的https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#using-pip-in-an-environmenthere解决方案。这意味着非conda用户可以在虚拟环境中简单地执行pip install -r requirements.txt,他们可以在没有conda的情况下使用virtualenv创建虚拟环境。

但是,如果您以上述样式生成了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激活了新创建的conda虚拟环境
  4. 使用conda install pip
  5. 安装了点子
  6. 使用conda intall pandas
  7. 安装的熊猫
  8. 使用conda install matplotlib
  9. 安装了matplotlib
  10. 使用pip freeze > requirements.txt生成了与pip兼容的requrements.txt文件

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

解决方法

我为上述找到的最佳解决方案是下面将要描述的组合。对于0 transworld system inc trying colect debt mine ... 1 complaint cals ocur betwen cel job 2 company violated 3 previously requested experian actualy mine ins... 4 company trans union noticed dtype: object ,我首先将环境列表导出为conda,然后省略软件包的内部版本号,这通常会使在另一个OS上重现环境变得很困难:

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中的well-known issue。获得“干净” 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 ... pip之间的上述区别不同,这很可能是因为condaconda更通用,并且不仅包括Python软件包。>

我个人发现,分发软件包时,通过检查代码(所需输入的内容是什么)来确定所需的最小软件包及其版本可能更为简洁,而不是盲目导出完整的{ {1}}或pip列表,这些列表可能最终(偶然地或不是偶然地)包括使用该软件包并非真正必要的软件包。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...