【问题标题】:How to import an Anaconda environment .yml in virtualenv?如何在 virtualenv 中导入 Anaconda 环境 .yml?
【发布时间】:2019-03-24 05:53:55
【问题描述】:

我只需要在 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

【问题讨论】:

  • 您的文件真的是这样吗?我问是因为它是一个无效的 YAML 文件,由根级别的“密钥”- pip 引起。你确定并且值不应该缩进吗?

标签: python anaconda yaml virtualenv jupyter


【解决方案1】:

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 相比)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2022-10-18
  • 2021-07-09
  • 2019-10-12
相关资源
最近更新 更多