从conda创建requirements.txt文件给pip3使用。
从conda创建requirements.txt文件给pip3使用。
我通常使用conda来管理我的环境,但现在我正在进行一个需要比我的笔记本电脑更强大的项目。所以我想使用我的大学工作站,它们配备了新的Intel Xeon处理器。但是我没有管理员权限,工作站上没有conda,所以我被迫使用virtualenv和pip3来工作。\n如何从conda生成一个可以与pip3和venv一起使用的requirements.txt文件?\n\"conda list -e > requirements.txt\"无法生成兼容的文件:\n\"=\"不是有效的运算符。你是不是想要\"==\"?\nconda的输出是:\n# 这个文件可以用来创建一个环境,使用命令:\n# $ conda create --name
在讨论中,我想提到你实际上可以看到pip
和conda
的角色之间的一些分离。
pip
是一个标准的包管理器,它只做一件事并且做得很好。可以在一个环境中生成requirements.txt
文件,并通过pip
在一个新环境中安装。
现在有conda
输出:你正确地捕捉到他们的评论,其中说'我们生成了这个库列表以便与conda一起工作'。请注意,Python本身在conda的列表中,并且(正确地)不在requirements.txt
中。conda复制自己的安装,这就是为什么它的库列表更长,并且包含Python本身的原因。
pip
生成了一个在标准库之上安装的包的列表,以使您编写的包工作。希望这有助于区分这两者。
此外,pipenv是一个较新的工具,可以为您提供虚拟环境和包管理。
pipenv仍然是Python基础之上的一个工具,就像pip一样。它不会处理Python之外的依赖。这就是conda的作用,它处理更大的图景,详见pip和conda之间的区别是什么?
虽然这个答案提供了一些额外有用的信息,但它没有提供与conda和pip一起使用的实际命令。
问题的原因是在conda环境中使用pip freeze命令输出的格式不符合预期。输出结果中的包名和版本号之间使用了@符号,而期望的格式是使用==符号进行分隔。
解决方法是在激活的conda环境中使用pip list --format=freeze命令来获取正确的格式。然后可以将结果保存到requirements.txt文件中,方法是使用命令pip list --format=freeze > requirements.txt。
这样就可以得到符合预期的格式的requirements.txt文件,其中每行包含一个包名和版本号,使用==符号进行分隔。这个文件可以被用作pip的虚拟环境的需求文件,方便其他人使用pip进行包管理。
代码如下:
pip list --format=freeze > requirements.txt
从上述内容中可以看出,问题的出现原因是conda list -e > requirements.txt
命令生成的requirements.txt
文件不符合pip
的正确格式。解决方法是在conda
环境中安装pip
,然后使用pip freeze
命令生成正确格式的requirements.txt
文件。接下来可以使用生成的requirements.txt
文件创建一个pip
虚拟环境。如果在requirements.txt
中出现奇怪的路径引用,可以使用pip list --format=freeze > requirements.txt
命令代替。这个解决方法提供了具体的命令来回答原始的问题,是最佳答案。另外,如果使用conda
,最好的选择是使用conda env export > environment.yml
命令来创建虚拟环境,并且提交environment.yml
文件,然后使用conda env create -f environment.yml
命令来恢复环境。但是需要注意,原问题是在一个只安装了pip
而没有安装conda
的机器上创建虚拟环境,所以这个方法不适用。