从conda创建requirements.txt文件用于pip3

219

我通常使用conda来管理我的环境,但现在我在一个需要比我的笔记本电脑更强大的项目上。所以我想使用我的大学工作站,它们有新的英特尔Xeon处理器。但我没有管理员权限,工作站也没有conda,所以我被迫使用virtualenv和pip3。

如何从conda生成可以与pip3和venv一起使用的requirements.txt?

conda list -e > requirements.txt

不能生成兼容的文件:

= is not a valid operator. Did you mean == ?

conda 的输出为:

# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: osx-64
certifi=2016.2.28=py36_0
cycler=0.10.0=py36_0
freetype=2.5.5=2
icu=54.1=0
libpng=1.6.30=1
matplotlib=2.0.2=np113py36_0
mkl=2017.0.3=0
numpy=1.13.1=py36_0
openssl=1.0.2l=0
pip=9.0.1=py36_1
pyparsing=2.2.0=py36_0
pyqt=5.6.0=py36_2
python=3.6.2=0
python-dateutil=2.6.1=py36_0
pytz=2017.2=py36_0
qt=5.6.2=2
readline=6.2=2
scikit-learn=0.19.0=np113py36_0
scipy=0.19.1=np113py36_0
setuptools=36.4.0=py36_1
sip=4.18=py36_0
six=1.10.0=py36_0
sqlite=3.13.0=0
tk=8.5.18=0
wheel=0.29.0=py36_0
xz=5.2.3=0
zlib=1.2.11=0

我本来想手动将所有的=改成==,但conda输出中有两个=,该改哪一个呢?肯定有更简单的方法吧?

编辑:pip freeze > requirements.txt 输出:

certifi==2016.2.28
cycler==0.10.0
matplotlib==2.0.2
matplotlib-venn==0.11.5
numpy==1.13.1
pyparsing==2.2.0
python-dateutil==2.6.1
pytz==2017.2
scikit-learn==0.19.0
scipy==0.19.1
six==1.10.0

9
你可以在电脑上使用 'pip freeze' 命令。 - Evgeny
1
但是输出结果不同,我的意思是conda命令比“pip freeze”的输出结果有更多的软件包。 - ITA
2
不行,如果它能工作的话就没有问题了。我觉得这样做不能实现很奇怪。也许人们很少在环境管理器之间切换,但是...需要是可以想象的。 - ITA
你愿意选择一个答案吗? - Evgeny
3
我不确定,因为我没有看到完整的答案;你解释了这些工具的作用,但我并没有看到如何使用virtualenv或pipenv成功地复制一个conda环境的解决方案。 - ITA
显示剩余11条评论
7个回答

372

正如顶部的评论所示,

conda list -e > requirements.txt

的输出可以用于创建一个带有 conda 的虚拟环境:

conda create --name <env> --file requirements.txt

但是这个输出格式不适合 pip

如果您想要一个文件来创建 pip 虚拟环境(即符合格式要求的 requirements.txt 文件), 您可以在 conda 环境中安装 pip,然后使用 pip 来创建 requirements.txt

conda activate <env>
conda install pip
pip freeze > requirements.txt

然后使用生成的requirements.txt文件创建一个pip虚拟环境:

python3 -m venv env
source env/bin/activate
pip install -r requirements.txt

测试时,输出结果中的包并不完全相同(pip 包含的包更少),但已足以建立一个功能环境。

如果在 requirements.txt 中出现奇怪的路径引用,请使用以下命令:

pip list --format=freeze > requirements.txt

20
这是最佳答案并应该被采纳,因为它提供了具体的命令来完成/回答原始的SO问题。 - Rich Lysakowski PhD
36
如果你在跟进这个线程并且在requirements.txt中遇到了奇怪的路径引用,可以使用命令pip list --format=freeze > requirements.txt来解决。参考链接:https://dev59.com/VVIG5IYBdhLWcg3wzEvT#62886215 - tnwei
2
@JohnnyUtah小心。创建一个完全空的环境不会包括pip,因此您的建议最终会在预期目标环境之外安装所有这些软件包。此外,OP明显是在询问如何转移到一种根本没有Conda的系统,因此需要使用pipvenv - merv
2
啊,@merv说得好。在创建和激活Conda环境之后,在运行pip install -r requirements.txt之前,您能否明确安装pip - JohnnyUtah
7
如果您正在使用conda,最佳选择是使用conda env export > environment.yml命令导出环境,提交您的environment.yml文件,然后运行conda env create -f environment.yml命令来创建环境。 - Playing With BI
显示剩余5条评论

68

问题

在一个conda环境中,只是简单的调用

pip freeze

输出:

ipykernel @ file:///C:/ci/ipykernel_1607454116140/work/dist/ipykernel-5.3.4-py3-none-any.whl
ipython @ file:///D:/bld/ipython_1612487184680/work
...

期望格式:

ipykernel==5.3.4
ipython==7.20.0
...

解决方案

在一个已激活的conda环境中,我需要使用以下命令:

pip list --format=freeze
为那些更倾向于使用带虚拟环境的pip的人生成需求文件的正确格式。
保存到文件:
pip list --format=freeze > requirements.txt

10
完美运行!只需使用 pip list --format=freeze > requirements.txt 命令将包列表存储为 requirements.txt 文件并保存在项目目录中。 - Pam Cesar

33

讨论后,我想提及一下,您实际上可以看到pipconda的角色分离。

pip是标准的包管理器,它只做一件事并且做得很好。在一个环境中生成的requirements.txt可以由pip在新环境中安装。

现在有了conda输出:您正确地捕获了他们的评论,其中说'我们生成了此库列表以与conda一起使用'。请注意,Python本身在conda列表中 (正常情况下)不在requirements.txt中。 conda复制自己的安装,这就是为什么它的库列表较长并包含Python本身的原因。

pip会生成已安装在标准库之上的软件包列表,以使您编写的软件包能够工作。希望这有助于区分两者。

还有一个新工具pipenv,可以为您执行虚拟环境和包管理。


16
Pipenv仍然是建立在Python基础上的一个工具,就像pip一样。它不会处理Python之外的要求。那就是conda的任务,去处理更大的情况,请参见 pip和conda有什么区别? - Martijn Pieters
2
虽然这个答案提供了一些额外有用的信息,但它并没有提供与conda和pip一起使用的实际命令。 - Rich Lysakowski PhD

24

如果有人想从conda中的现有项目生成requirements.txt,请按照以下步骤:

  • 进入项目环境 conda activate <env_name>

  • conda list 给出该环境所使用的所有软件包列表

  • conda list -e > requirements.txt 将所有软件包信息保存到您的文件夹中

  • conda env export > <env_name>.yml

  • pip freeze


8
OP 希望获得一个可用的 requirements.txt 文件。这个步骤如何帮助他们实现这一目标? - mabraham
5
这个答案非常有用,因为它提供了创建yaml文件以重新构建conda环境所需的确切软件包列表和命令,而不仅仅是pip软件包列表。 - Rich Lysakowski PhD
Aishwat,感谢分享。你能解释一下这个魔法是如何发生的吗? - SKSKSKSK

6

如上面的评论所提到的,正确的完整答案是:

pip list --format=freeze > requirements.txt

3

激活conda环境:
conda activate flask-test

获取conda环境路径并复制:
conda list

将复制的路径加上 lib\site-packages,并在pip中使用--path 选项:
pip freeze --path C:\Users\username\Miniconda3\envs\flask-test\lib\site-packages > requirements.txt Linux系统下的路径为:/home/username/miniconda3/envs/flask-app/lib/python3.8/site-packages/


0

我编写了一些简单的Python脚本,用于将conda requirements.txt转换为pip3。

只需复制以下代码即可。

f = open(r"requirements.txt", "r").read()
f1 = f.split("\n")
for line in f1:  
    if "=" in line:
       a = line.split("=")[0:-1]
       print(a[0]+"==" + a[1])

然后只需复制打印的输出;

样本输出:

_libgcc_mutex==0.1
_openmp_mutex==4.5
blas==1.0
brotli==1.0.9
bzip2==1.0.8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接