【问题标题】:Conda importing one environment.yml into anotherConda 将一个 environment.yml 导入另一个
【发布时间】:2018-01-08 21:12:58
【问题描述】:

考虑将具有依赖项的 Python 子模块导入到具有自己的依赖项的项目中的情况。假设子模块有它的environment.yml 文件,而项目本身有一个environment.yml 文件。

有没有一种方法可以创建一个包含这两种环境规范的环境,如果有,你会怎么做? (或者有没有更好/更首选的方法来处理这种情况?)

【问题讨论】:

    标签: python git-submodules conda


    【解决方案1】:

    我猜你是开发子模块和项目的人,因为依赖项仍在 environment.yml 文件中。

    选项 1:使用子模块的 environment.yml 更新项目环境

    不幸的是,如果您的子模块依赖于 conda 包,这可能是您唯一的选择。

    # First create the project environment
    $ conda env create --force -f project_environment.yml
    
    # Then update with submodule dependencies
    $ conda env update -n project-env-name --file submodule_environment.yml
    

    这不太理想,因为基本预期是您导入的库带有自己的依赖项。

    选项 2:将依赖项放入相应的 requirements.txt 文件中

    这仅适用于可以通过 pip 从 PyPi 安装子模块依赖项的情况。先把项目和子模块的依赖放到各自的requirements.txt文件中。

    然后重组environment.yml 文件,如下所示:

    submodule_environment.yml

    name: submodule-env-name
    channels:
      - defaults
    dependencies:
    - python=3.6.3             # no conda dependencies
    - pip:
        - -r requirements.txt  # <--- submodule dependencies
    

    project_environment.yml

    name: project-env-name
    channels:
      - defaults
    dependencies:
    - python=3.6.3
    - pip:
        - -r requirements.txt                    # <--- project dependencies
        - -r project/submodule/requirements.txt  # <--- submodule dependencies
    

    这样你可以完全忽略submodule_environment.yml文件,然后用一条命令创建项目环境。

    $ conda env create --force -f project_environment.yml
    

    如果您的 submodule 依赖于 conda 包,则此方法将不起作用。如果是这样,那么选项 1 是您的最佳选择。

    选项 3:打包子模块(理想)

    假设子模块没有 conda 依赖项,那么最好只从子模块中制作一个单独的包。创建一个setup.py 并将所有依赖项放入install_requires 字段。这是setup.py 文件应该是什么样子的模板。

    打包后,您可以执行以下操作:

    • 使用以下命令在本地安装:
      • pip install .
    • 上传到 github 或 bitbucket 并使用以下命令安装:
      • pip install git+https://github.com/username/submodule.git --upgrade
    • 上传到 github 或 bitbucket 并在pip 下的requirements.txtenvironment.yml 中添加以下内容:
      • git+https://github.com/username/submodule.git#egg=submodule

    【讨论】:

    • 这是一个很好的答案。它说明了我在其他任何地方都没有看到过的关于 conda 包装的事情。 @nitred,你有没有参考你在哪里找到了如何做到这一点?
    • This 是我管理 conda 环境的资源。我读到那一天是我使用 venv 或 pipenv 的最后一天 :) 还通过 conda CLI 文档填补了空白。然而,选项 1,尤其是选项 2 是管理环境的非传统用例。我总是建议维护一个单一的环境文件,并确保你的代码是通过setup.py 打包的。附言您甚至可以从环境文件中执行 pip install .pip install -e . ;)
    • 很遗憾,使用 conda 我们需要借助 pip 来安装另一个已经有 conda 定义的包,有人会认为现在已经解决了......
    • @kellpossible 不正确,选项 1 根本不依赖 pip,project_environment.ymlsubmodule_environment.yml 文件都只能具有 conda 依赖项。 OP 具有不寻常的项目结构,需要不寻常的解决方案。自 2018 年以来,数据科学包也取得了长足的进步,大多数都在 Pypi 上得到完全支持,并且可以通过 pip 获得。如果依赖项可以通过 pip 获得,则可以将它们放入 setup.py,这使它们成为包的官方和可执行依赖项。
    • @nitred 是的,你说得对,选项 1 不依赖于 pip。如果它不需要额外的命令行参数来促进它仍然会很好,而是在父项目的 environment.yml 中捕获有关与子项目的关系的信息。不过,您回复的后半部分暗示首先使用 conda 的需求较少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多