我正在使用Anaconda虚拟环境设置python项目。我正在生成一个requirements.txt,以便其他人可以轻松地为项目设置自己的虚拟环境。
我很想知道,当其他开发者想要为该项目做出贡献,但想要使用virtualenv而不是Anaconda时,他们可以这样做吗?
我尝试了以下内容:
我在Anaconda环境中设置了一个空项目并安装了aiohttp模块。然后conda list --export > requirements.txt
生成以下内容:
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: win-64
aiohttp=2.3.9=py36_0
async-timeout=2.0.0=py36hc3e01a3_0
certifi=2018.1.18=py36_0
chardet=3.0.4=py36h420ce6e_1
multidict=3.3.2=py36h72bac45_0
pip=9.0.1=py36h226ae91_4
python=3.6.4=h6538335_1
setuptools=38.4.0=py36_0
vc=14=h0510ff6_3
vs2015_runtime=14.0.25123=3
wheel=0.30.0=py36h6c3ec14_1
wincertstore=0.2=py36h7fe50ca_0
yarl=0.14.2=py36h27d1bf2_0
我在virtualenv环境中设置了一个空项目,并在那里安装了aiohttp模块。 pip freeze > requirements.txt
然后生成:
aiohttp==3.0.1
async-timeout==2.0.0
attrs==17.4.0
chardet==3.0.4
idna==2.6
idna-ssl==1.0.0
multidict==4.1.0
yarl==1.1.0
显然两个输出都是不同的,我的理论是:一旦我在我的项目中使用conda生成我的requirements.txt,其他开发人员就不能选择virtualenv - 至少不是如果他们没有准备好手动安装长列表要求(当然,它不仅仅是aiohttp模块)。
第一眼,在virtualenv(pip install -r requirements-conda.txt
)的项目中导入conda生成的requirements.txt会引发此错误:
Invalid requirement: 'aiohttp=2.3.9=py36_0'
= is not a valid operator. Did you mean == ?
我认为如果开发人员愿意这样做,他们需要以编程方式将包列表更改为virtualenv理解的格式,否则他们必须手动导入所有包?这意味着我强迫他们选择conda作为虚拟环境,如果他们想为自己节省一些额外的工作吗?
答案 0 :(得分:1)
我正在使用Anaconda虚拟环境设置python项目。我想知道,当其他开发人员想要为该项目做出贡献,但是想要使用virtualenv而不是Anaconda时,他们能做到这一点吗?
是的-实际上这就是我的许多项目的结构。为了完成您要寻找的内容,这是一个简单的目录,我们将其用作参考:
.
├── README.md
├── app
│ ├── __init__.py
│ ├── static
│ ├── templates
├── migrations
├── app.py
├── environment.yml
├── requirements.txt
在上面的项目目录中,我们同时有 environment.yml (对于Conda用户)和 requirements.txt (对于pip
)。
environment.yml
因此,显然两个输出都是不同的,我的理论是:一旦我在项目上生成带有conda的requirements.txt,其他开发人员就不能选择virtualenv了-至少如果他们不准备长时间安装,则至少不能选择virtualenv手动列出需求(当然,不仅仅是aiohttp模块)。
为解决这个问题,我们使用了两个不同的环境文件,每个文件的格式都不同,允许其他贡献者选择他们喜欢的文件。如果亚当使用Conda来管理他的环境,那么他所要做的全部工作就是从environment.yml
文件中创建他的Conda:
conda env create -f environment.yml
yml文件的第一行设置新环境的名称。这就是我们创建带有Conda风格的环境文件的方式。然后激活您的环境(source activate
或conda activate
)
conda env export > environment.yml
实际上,由于conda env export
命令创建的环境文件可以处理环境的pip
软件包和conda
软件包,因此我们甚至不需要两个不同的过程来创建这个文件。 conda env export
将导出您环境中的所有软件包,而不考虑它们是从哪个安装渠道安装的。它将在environment.yml
中对此进行记录:
name: awesomeflask
channels:
- anaconda
- conda-forge
- defaults
dependencies:
- appnope=0.1.0=py36hf537a9a_0
- backcall=0.1.0=py36_0
- cffi=1.11.5=py36h6174b99_1
- decorator=4.3.0=py36_0
- ...
requirements.txt
我是对的,我认为如果开发人员想要这样做,他们需要以编程方式将软件包列表更改为virtualenv可以理解的格式,否则他们将不得不手动导入所有软件包?意思是说,如果他们想节省一些额外的工作,我还强迫他们选择conda作为虚拟环境?
推荐的(传统的)更改为 pip可以理解的格式的方式是通过requirements.txt
。然后激活您的环境(source activate
或conda activate
)
pip freeze > requirements.txt
说说夏娃(Eve Eve),项目贡献者之一想从requirements.txt
创建一个相同的虚拟环境,她可以:
# using pip
pip install -r requirements.txt
# using Conda
conda create --name <env_name> --file requirements.txt
完整的讨论超出了此答案的范围,但是similar questions值得一读。
requirements.txt
的示例:
alembic==0.9.9
altair==2.2.2
appnope==0.1.0
arrow==0.12.1
asn1crypto==0.24.0
astroid==2.0.2
backcall==0.1.0
...
requirements.txt
通常,即使在所有成员都是Conda用户的项目中,我仍然建议同时创建environment.yml
(供贡献者使用)以及requirements.txt
环境文件。我还建议尽早(最好从一开始)就通过版本控制对这两个环境文件进行跟踪。这有很多好处,其中包括以下事实:它简化了调试过程和以后的部署过程。
一个想到的具体示例是Azure App Service的示例。假设您有一个Django / Flask应用程序,并想使用启用了git部署的Azure应用服务将该应用程序部署到Linux服务器:
az group create --name myResourceGroup --location "Southeast Asia"
az webapp create --resource-group myResourceGroup --plan myServicePlan
该服务将查找两个文件,一个文件为application.py
,另一个文件为requirements.txt
。您绝对需要这两个文件(即使它们是空白文件)也能使自动化工作。当然,这随云基础架构/提供商的不同而不同,但是我发现在我们的项目中使用requirements.txt
通常可以为我们节省很多麻烦,并且值得进行初始设置。
如果您的代码在GitHub上,则requirements.txt
还可以让您更加省心,因为在提醒您/回购所有者之前,可以对其漏洞检测进行任何检查。拥有这个额外的依赖文件(价格不菲)的优点是,免费具有很大的价值。
这就像确保每次安装新依赖项一样简单,我们同时运行conda env export
和pip freeze > requirements.txt
命令。