【发布时间】:2021-08-16 18:30:27
【问题描述】:
此脚本将打印环境变量。
使用 Python 3.9。
目标是能够在需要时运行任何子命令。我得到的错误是,如果添加了任何额外的短标志,“忽略环境”arg 正在尝试解析它。我不想要这个。在--eval 之后分配的任何内容都会附加短标志。
解析器.py
import argparse, os
def parseargs(p):
p.usage = '%(prog)s [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]'
p.add_argument(
"-i",
"--ignore-environment",
action="store_const",
const=dict(),
dest="env",
help="start with an empty environment",
default=os.environ,
)
p.add_argument(
"--export",
nargs=1,
help="Set argument with --export NAME=VALUE"
)
p.add_argument(
"--eval",
nargs="+",
help="Run any commands with newly updated environment, "
"--eval COMMAND ARGS"
)
return p
执行如下
>>> p = argparse.ArgumentParser()
>>> parseargs(p) # assigns arguments to parser
>>> p.parse_args('--export FOO=bar --eval cat test.py'.split()) # This is ok and works correctly. cat is the bash command
Namespace([os.environs..], eval=['cat', 'test.py'], export=['FOO=bar'])
>>>p.parse_args('--export FOO=bar --eval ls -l'.split()) # This is fails
error: unrecognized arguments: -l
如何让“-l”被“-i/ignore environment”忽略但传递给 eval,例如使用 cat test.py。我曾尝试使用 sub_parser 但无济于事。出现同样的结果。
【问题讨论】:
-
--eval ls \-l? -
@9769953 shell 在脚本执行之前执行引号移除;
argparse仍将看到--eval、ls和-l。 -
@chepner 这里没有外壳。但实际上,在尝试时,它被 argparse 解析为文字 ``。
-
正确,因为反斜杠转义是特定于 shell 的功能。
argparse没有这样的概念。