如何在virtualenv中导入Anaconda环境.yml?

时间:2018-10-19 10:36:26

标签: python anaconda yaml virtualenv jupyter

我只需要在virtualenv虚拟环境中导入Anaconda .yml环境文件。

我需要这样做的原因是因为在nVidia Jetson TX2开发板上,我无法安装和运行Anaconda发行版(它与ARM体系结构不兼容)。相反,Virtualenv和Jupyter可以完美安装并运行。

.yml文件列出如下:

name: tfdeeplearning
channels:
  - defaults
dependencies:
  - bleach=1.5.0=py35_0
  - certifi=2016.2.28=py35_0
  - colorama=0.3.9=py35_0
  - cycler=0.10.0=py35_0
  - decorator=4.1.2=py35_0
  - entrypoints=0.2.3=py35_0
  - html5lib=0.9999999=py35_0
  - icu=57.1=vc14_0
  - ipykernel=4.6.1=py35_0
  - ipython=6.1.0=py35_0
  - ipython_genutils=0.2.0=py35_0
  - ipywidgets=6.0.0=py35_0
  - jedi=0.10.2=py35_2
  - jinja2=2.9.6=py35_0
  - jpeg=9b=vc14_0
  - jsonschema=2.6.0=py35_0
  - jupyter=1.0.0=py35_3
  - jupyter_client=5.1.0=py35_0
  - jupyter_console=5.2.0=py35_0
  - jupyter_core=4.3.0=py35_0
  - libpng=1.6.30=vc14_1
  - markupsafe=1.0=py35_0
  - matplotlib=2.0.2=np113py35_0
  - mistune=0.7.4=py35_0
  - mkl=2017.0.3=0
  - nbconvert=5.2.1=py35_0
  - nbformat=4.4.0=py35_0
  - notebook=5.0.0=py35_0
  - numpy=1.13.1=py35_0
  - openssl=1.0.2l=vc14_0
  - pandas=0.20.3=py35_0
  - pandocfilters=1.4.2=py35_0
  - path.py=10.3.1=py35_0
  - pickleshare=0.7.4=py35_0
  - pip=9.0.1=py35_1
  - prompt_toolkit=1.0.15=py35_0
  - pygments=2.2.0=py35_0
  - pyparsing=2.2.0=py35_0
  - pyqt=5.6.0=py35_2
  - python=3.5.4=0
  - python-dateutil=2.6.1=py35_0
  - pytz=2017.2=py35_0
  - pyzmq=16.0.2=py35_0
  - qt=5.6.2=vc14_6
  - qtconsole=4.3.1=py35_0
  - requests=2.14.2=py35_0
  - scikit-learn=0.19.0=np113py35_0
  - scipy=0.19.1=np113py35_0
  - setuptools=36.4.0=py35_1
  - simplegeneric=0.8.1=py35_1
  - sip=4.18=py35_0
  - six=1.10.0=py35_1
  - testpath=0.3.1=py35_0
  - tk=8.5.18=vc14_0
  - tornado=4.5.2=py35_0
  - traitlets=4.3.2=py35_0
  - vs2015_runtime=14.0.25420=0
  - wcwidth=0.1.7=py35_0
  - wheel=0.29.0=py35_0
  - widgetsnbextension=3.0.2=py35_0
  - win_unicode_console=0.5=py35_0
  - wincertstore=0.2=py35_0
  - zlib=1.2.11=vc14_0
- pip:
  - ipython-genutils==0.2.0
  - jupyter-client==5.1.0
  - jupyter-console==5.2.0
  - jupyter-core==4.3.0
  - markdown==2.6.9
  - prompt-toolkit==1.0.15
  - protobuf==3.4.0
  - tensorflow==1.3.0
  - tensorflow-tensorboard==0.1.6
  - werkzeug==0.12.2
  - win-unicode-console==0.5
prefix: C:\Users\Marcial\Anaconda3\envs\tfdeeplearning

1 个答案:

答案 0 :(得分:3)

pip可以从requirements.txt文件安装,该文件看起来像 序列中作为键值的项目 pip文件中的.yml,但没有破折号:

ipython-genutils==0.2.0
jupyter-client==5.1.0
jupyter-console==5.2.0
jupyter-core==4.3.0
markdown==2.6.9
prompt-toolkit==1.0.15
protobuf==3.4.0
tensorflow==1.3.0
tensorflow-tensorboard==0.1.6
werkzeug==0.12.2
win-unicode-console==0.5

假设文件的末尾实际上是这样的:

  .
  .
  .
  - wincertstore=0.2=py35_0
  - zlib=1.2.11=vc14_0
  - pip:
    - ipython-genutils==0.2.0
    - jupyter-client==5.1.0
    - jupyter-console==5.2.0
    - jupyter-core==4.3.0
    - markdown==2.6.9
    - prompt-toolkit==1.0.15
    - protobuf==3.4.0
    - tensorflow==1.3.0
    - tensorflow-tensorboard==0.1.6
    - werkzeug==0.12.2
    - win-unicode-console==0.5
prefix: C:\Users\Marcial\Anaconda3\envs\tfdeeplearning

(即缩进pip的条目以使其成为有效的YAML文件), 并命名为anaconda-project.yml,您可以执行以下操作:

import ruamel.yaml

yaml = ruamel.yaml.YAML()
data = yaml.load(open('anaconda-project.yml'))

requirements = []
for dep in data['dependencies']:
    if isinstance(dep, str):
        package, package_version, python_version = dep.split('=')
        if python_version == '0':
            continue
        requirements.append(package + '==' + package_version)
    elif isinstance(dep, dict):
        for preq in dep.get('pip', []):
            requirements.append(preq)

with open('requirements.txt', 'w') as fp:
    for requirement in requirements:
       print(requirement, file=fp)

产生requirement.txt文件,该文件可以与:

一起使用
pip install -r requirements.txt

请注意:

  • 非pip包可能无法从PyPI获得

  • 当前pip版本为18.1,该要求列表中的版本为旧

  • 根据官方YAML常见问题解答,使用.yml作为 仅在以下情况下,才应为您的YAML文件扩展名 .yaml扩展名。在现代文件系统上,情况并非如此。一世 不知道Anaconda是否经常不合格,或者您 在这件事上可以选择。

  • 自从几年前引入二元轮以来, 支持它们的软件包,这经常(而且对我来说总是)可能 只使用virtualenvs和pip。从而规避了 由Anaconda引起的问题不是100%兼容且不符合 最新的所有软件包(与PyPI相比)。