当前位置: 首页 > 面试题库 >

使用argparse时从环境变量设置选项

于恺
2023-03-14
问题内容

我有一个脚本,该脚本具有某些选项,可以在命令行或环境变量中传递它们。如果两者都存在,则CLI应该具有优先权,如果两者均未设置,则会发生错误。

我可以检查是否在解析后分配了该选项,但是我更喜欢让argparse进行繁重的工作,并在解析失败时负责显示用法语句。

我已经提出了一些替代方法(我将在下面作为答案发布,以便可以分别讨论),但是它们对我来说很不合时宜,我认为我缺少一些东西。

有没有公​​认的“最佳”方法?

(当未设置CLI选项和环境变量时,进行编辑以使所需的行为清晰可见)


问题答案:

我经常使用此模式,以至于我打包了一个简单的操作类来处理它:

import argparse
import os

class EnvDefault(argparse.Action):
    def __init__(self, envvar, required=True, default=None, **kwargs):
        if not default and envvar:
            if envvar in os.environ:
                default = os.environ[envvar]
        if required and default:
            required = False
        super(EnvDefault, self).__init__(default=default, required=required, 
                                         **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, values)

然后,我可以使用以下代码从我的代码中调用它:

import argparse
from envdefault import EnvDefault

parser=argparse.ArgumentParser()
parser.add_argument(
    "-u", "--url", action=EnvDefault, envvar='URL', 
    help="Specify the URL to process (can also be specified using URL environment variable)")
args=parser.parse_args()


 类似资料:
  • 我有一个脚本,它有一些选项,可以在命令行上传递,也可以从环境变量中传递。如果两者都存在,CLI应优先,如果两者都未设置,则会发生错误。 我可以检查是否在解析后分配了该选项,但我更愿意让argparse来完成繁重的工作,并在解析失败时负责显示usage语句。 我已经提出了一些替代方法(我将在下面作为答案发布,以便可以单独讨论),但它们对我来说很笨拙,我认为我遗漏了一些东西。 有没有一种公认的“最佳”

  • ENV 设置环境变量 格式有两种: ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... 这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。 ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet" 这个例子中演示了如何换行,以

  • 问题内容: 我希望能够在交互式sbt shell中设置环境变量,但我似乎找不到找到这种方法的方法。(我看过官方的sbt文档以及stackoverflow都没有成功)。 我想说明的是, 我不需要 在文件中设置此环境变量,而是可以在交互式sbt shell会话中即时更改它,以便将环境变量用于下一个我运行的sbt命令。 例如,我希望能够做类似的事情(在sbt shell中): 这可能吗?如果是的话,我该

  • 问题内容: 如何从Java设置环境变量?我看到我可以使用来对子流程执行此操作ProcessBuilder。不过,我有几个子流程要启动,所以我宁愿修改当前流程的环境,并让这些子流程继承它。 有一个获取单个环境变量的方法。我还可以使用获取Map完整的环境变量集。但是,调用put()该方法Map将引发-显然,这意味着该环境是只读的。而且,没有。 那么,有什么方法可以在当前运行的进程中设置环境变量?如果是

  • 问题内容: 我有一个脚本来设置交叉编译所需的所有变量。这只是其中的一部分: 如果这样做,所有环境变量都将导入到当前的Shell会话中,并且可以编译我的示例。 是否可以在cmake中导入这些变量?如果是,怎么办? 更多细节: 我正在使用ELDK v 5.4,它的安装脚本生成一个脚本,该脚本设置所有环境变量 我找到了本教程,该教程说明了如何手动设置交叉编译,但没有说明如何使用脚本来设置所有内容 如果我

  • 问题内容: 需要基于构建环境配置来设置标签的href值。 例如: 分期应有 产品应具有 当前设置: 生成命令: .env.staging.js: index.html: 在index.html中,这似乎不起作用。虽然类似的设置适用于JS文件 (可能是因为将JS文件解析并捆绑到一个文件中,并且捆绑程序在该时间点读取值) 尝试过的事情: index.html: (类似于PUBLIC_URL变量) 与浏