【问题标题】:How to access environment name in kedro pipeline如何在kedro管道中访问环境名称
【发布时间】:2021-12-14 21:42:39
【问题描述】:

有没有办法访问kedro管道环境名称?其实下面是我的问题。

我正在加载如下配置路径

conf_paths = ["conf/base", "conf/local"]  
conf_loader = ConfigLoader(conf_paths)
parameters = conf_loader.get("parameters*", "parameters*/**")
catalog = conf_loader.get("catalog*")

但我的环境很少,如"conf/server" "conf/test" 等,所以如果我有可用的环境名称,我可以将其添加到 conf_paths 为"conf/<env_name>",这样 kedro 就会从相应的 env 文件夹中读取文件。 但是现在如果未将 env 路径添加到 conf_paths,即使我在运行 kedro 时指定了 env 名称,文件也不会被 kedro 读取,例如 kedro run --env=server 我搜索了所有文档,但找不到任何解决方案。

编辑: 更详细地阐述了这个问题。 我在节点中使用上面给出的参数和目录字典。我只有conf/base/parameters.yml 中所有运行通用的键和conf/server/parameters.yml 中的环境特定键但是当我做kedro run --env=server 时我得到keyerror 这意味着conf/server/parameters.yml 中的键在参数中不可用字典。如果我将conf/server 添加到 config_paths kedro 运行良好,没有 keyerror。

【问题讨论】:

  • 您始终可以在外部设置环境变量并使用os.environ['ENV_VAR_NAME'] 读取。但这不应该是必需的。只需通过kedro run --env=server 就可以了。您能否添加更多详细信息,为什么您认为它没有被阅读?
  • 如果你用kedro run --env=server运行,你为什么要手动构造conf_paths/ConfigLoader/等等?我不知道您使用的是什么版本,但它由 Kedro 框架以github.com/quantumblacklabs/kedro/blob/0.17.6/kedro/framework/… 之类的代码处理。在这里,您可以看到它采用了配置的环境(无需了解它是如何从您最初在 CI 中传递它的位置向下传播到这里的,它是如何到达 Kedro Session 构造函数的,等等)。
  • @Rahulkumar 添加了有关该问题的更多详细信息
  • @deepyaman 如何访问nodes.py 中的参数而不专门将参数传递给每个节点?
  • 当您使用kedro run --env=server 时。你没有定义conf_loader = ConfigLoader(conf_paths) 对吧?如果是,那么它已被硬编码为仅基础和本地环境。

标签: python kedro


【解决方案1】:

除非你试图覆盖某些东西,否则你不需要定义配置路径、配置加载器等。

如果您使用的是 kedro 0.17.x,则 hooks.py 将如下所示。

Kedro 会将基础、本地和您在运行时在conf_paths 中指定的环境传递到ConfigLoader

class ProjectHooks:
    @hook_impl
    def register_config_loader(
        self, conf_paths: Iterable[str], env: str, extra_params: Dict[str, Any]
    ) -> ConfigLoader:
        return ConfigLoader(conf_paths)

    @hook_impl
    def register_catalog(
        self,
        catalog: Optional[Dict[str, Dict[str, Any]]],
        credentials: Dict[str, Dict[str, Any]],
        load_versions: Dict[str, str],
        save_version: str,
        journal: Journal,
    ) -> DataCatalog:
        return DataCatalog.from_config(
            catalog, credentials, load_versions, save_version, journal
        )

有问题,我可以看到您已经定义了 conf_pathsconf_loader 并且 env 路径不存在。所以kedro会忽略运行时传递的env。

【讨论】:

  • 我在 hooks.py 中有相同的代码。实际上我想在nodes.py中使用参数。如何使用它。我尝试了下面的代码并且它不工作``` context = KedroContext("project_name", os.getcwd()) catalog = context.catalog parameters = catalog.load('parameters')''' 当我运行kedro run --env=server ''' 仍然 kedro 正在从基础/本地加载参数。我不确定我做错了什么。
  • 你可以试试这个from kedro.framework.session import get_current_sessionsession = get_current_session()context = session.load_context()context.params获取参数。
  • catalog.load('parameters') 这意味着您正在加载一个名为 parameters 的目录。
  • 顺便说一句,当您可以直接作为节点输入传递时,我不明白需要在节点中单独加载参数。
  • 这是有效的。但我希望我从命令行传递的 --params 应该添加到现有的环境参数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多