在conda虚拟环境中创建符合pip格式的requirements.txt文件。
在conda虚拟环境中创建符合pip格式的requirements.txt文件。
我在Windows 10 PC上创建了一个conda虚拟环境来进行项目开发。为了安装所需的包和依赖项,我使用conda install
而不是pip install
,这是根据最佳实践中提到的https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#using-pip-in-an-environment。
为了分发我的软件,我选择创建一个environment.yml文件和一个requirements.txt文件,分别针对conda和非conda用户。我可以将当前的虚拟环境导出为yml文件,为conda用户提供了解决方案。但是,为了使非conda用户能够复制相同的环境,我需要创建并共享requirements.txt文件。可以使用conda list --export > requirements.txt
命令创建此文件,但是这种格式与pip不兼容,其他用户无法在其系统上使用pip install -r requirements.txt
。
使用pip freeze > requirements.txt
是一个解决方案,可以在这里和这里找到。这意味着非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虚拟环境时,我们可能会遇到一个问题:在使用pip安装的软件包和conda安装的软件包之间存在不兼容的情况。为了解决这个问题,我们需要创建一个符合pip兼容格式的requirements.txt文件。
问题的原因是,当我们使用pip freeze
命令时,它会返回环境中安装的所有软件包,而不仅仅是我们应用程序所使用的软件包。这可能会导致requirements.txt文件中包含许多不必要的软件包。
为了解决这个问题,我们可以使用pipreqs
工具。这个工具可以根据我们应用程序中的导入语句,只包含我们实际使用的软件包。
下面是一个示例,演示如何使用pipreqs
创建requirements.txt文件:
首先,我们需要安装pipreqs
工具。可以使用以下命令安装:
pip install pipreqs
安装完成后,我们可以使用以下命令创建requirements.txt文件:
pipreqs /home/project/location
这将在指定的目录(/home/project/location)中成功保存requirements.txt文件。
最终生成的requirements.txt文件将只包含我们应用程序所使用的软件包,如下所示:
wheel==0.23.0 Yarg==0.1.9 docopt==0.6.2
我们可以查看pipreqs
的文档了解更多信息。
通过使用pipreqs
工具,我们可以创建一个符合pip兼容格式的requirements.txt文件,只包含我们应用程序所使用的软件包,从而解决pip和conda之间的不兼容问题。
在使用conda虚拟环境时,创建一个符合pip兼容格式的requirements.txt文件是一个常见的问题。下面是解决这个问题的原因和方法:
问题出现的原因是pip在较新的版本中存在一个已知问题,导致创建的requirements.txt文件包含了符号链接。而conda更加通用,不仅包含Python包,因此conda和pip导出的包列表是不同的。
解决方法是首先使用conda将环境列表导出为environment.yml文件,并省略软件包的构建号。然后使用pip将包列表导出为requirements.txt文件。
具体步骤如下:
1. 使用以下命令将conda环境列表导出为environment.yml文件:
conda env export > environment.yml --no-builds
导出的environment.yml文件示例:
name: myenv
channels:
- defaults
- conda-forge
dependencies:
- blas=1.0
- ca-certificates=2020.10.14
- certifi=2020.6.20
...
2. 使用以下命令将pip包列表导出为requirements.txt文件:
pip list --format=freeze > requirements.txt
导出的requirements.txt文件示例:
certifi==2020.6.20 cycler==0.10.0 kiwisolver==1.2.0 matplotlib==3.3.2 mkl-fft==1.2.0 ...
需要注意的是,conda和pip导出的列表是不同的,这是因为conda包含了更多的内容。
个人经验来看,为了分发一个包,最好是通过检查代码(导入了哪些包)来确定所需的最小包集和它们的版本,而不是盲目地导出完整的pip或conda列表,这可能会(无意或有意地)包含不真正需要使用该包的软件包。
另外,还有一个名为"conda-minify"的包可以实现上述的操作,它使用有向无环图来找到所有其他包的最高级别包作为依赖关系的来源。
以上就是解决在conda虚拟环境中创建符合pip兼容格式的requirements.txt文件的原因和方法。