使用conda

时间:2018-02-14 12:28:53

标签: python pip anaconda virtualenv conda

我正在使用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作为虚拟环境,如果他们想为自己节省一些额外的工作吗?

1 个答案:

答案 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 activateconda 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 activateconda 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还可以让您更加省心,因为在提醒您/回购所有者之前,可以对其漏洞检测进行任何检查。拥有这个额外的依赖文件(价格不菲)的优点是,免费具有很大的价值。

GitHub alerts

这就像确保每次安装新依赖项一样简单,我们同时运行conda env exportpip freeze > requirements.txt命令。