【发布时间】:2018-01-08 21:12:58
【问题描述】:
考虑将具有依赖项的 Python 子模块导入到具有自己的依赖项的项目中的情况。假设子模块有它的environment.yml 文件,而项目本身有一个environment.yml 文件。
有没有一种方法可以创建一个包含这两种环境规范的环境,如果有,你会怎么做? (或者有没有更好/更首选的方法来处理这种情况?)
【问题讨论】:
标签: python git-submodules conda
考虑将具有依赖项的 Python 子模块导入到具有自己的依赖项的项目中的情况。假设子模块有它的environment.yml 文件,而项目本身有一个environment.yml 文件。
有没有一种方法可以创建一个包含这两种环境规范的环境,如果有,你会怎么做? (或者有没有更好/更首选的方法来处理这种情况?)
【问题讨论】:
标签: python git-submodules conda
我猜你是开发子模块和项目的人,因为依赖项仍在 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
这不太理想,因为基本预期是您导入的库带有自己的依赖项。
这仅适用于可以通过 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 是您的最佳选择。
假设子模块没有 conda 依赖项,那么最好只从子模块中制作一个单独的包。创建一个setup.py 并将所有依赖项放入install_requires 字段。这是setup.py 文件应该是什么样子的模板。
打包后,您可以执行以下操作:
pip install .pip install git+https://github.com/username/submodule.git --upgradepip 下的requirements.txt 或environment.yml 中添加以下内容:
git+https://github.com/username/submodule.git#egg=submodule【讨论】:
conda CLI 文档填补了空白。然而,选项 1,尤其是选项 2 是管理环境的非传统用例。我总是建议维护一个单一的环境文件,并确保你的代码是通过setup.py 打包的。附言您甚至可以从环境文件中执行 pip install . 和 pip install -e . ;)
project_environment.yml 和 submodule_environment.yml 文件都只能具有 conda 依赖项。 OP 具有不寻常的项目结构,需要不寻常的解决方案。自 2018 年以来,数据科学包也取得了长足的进步,大多数都在 Pypi 上得到完全支持,并且可以通过 pip 获得。如果依赖项可以通过 pip 获得,则可以将它们放入 setup.py,这使它们成为包的官方和可执行依赖项。