如何从 argparse 重建(更改)sys.argv

问题描述 投票:0回答:2

我有一个 argparse,它在解析后进行预处理、更改和删除内容等。 然后它包装了一个用于获取 sys.argv 的 main 是否有更好的方法来重建具有适应字段的新 sys.argv?

文件1

self.args, self.unknown = parser.parse_known_args()
self.args.new = self.args.old +"new"
main(self.args.get_sys_argv())
argparse
2个回答
0
投票

我找到的最好的选择是有点手动:

def to_sys_argv(self):
  argv = __name__ # reconstruct the current file as the calling one see *1*
  argv += " "
  argv += " ".join(f"--{k} {v}" for k, v in vars(self.args).items())

# one liner __name__ + " " + " ".join(f"--{k} {v}" for k, v in vars(self.args).items())

1:重构主叫名字的时候,有点看你的目标。 如果您在 main() 中有另一个 argparse,那没关系。否则,如果完整或主文件名,您可能需要 sys.argv[0]。


0
投票
import sys
import argparse

# define the argument parser
parser = argparse.ArgumentParser(description='Example')
parser.add_argument('--old', type=str, help='Old argument')

# parse the arguments and do preprocessing
args, unknown = parser.parse_known_args()
args.new = args.old + "new"

# create a new sys.argv list with the modified arguments
new_argv = [sys.argv[0]]
for arg in sys.argv[1:]:
    if arg.startswith('--old='):
        # replace the old argument with the new one
        new_argv.append('--new=' + args.new)
    else:
        # keep the original argument
        new_argv.append(arg)

# call the main function with the new sys.argv list
main(new_argv)

在这个例子中,我们创建了一个新的 new_argv 列表,它以脚本的名称 (sys.argv[0]) 开头,然后用原始参数填充列表,除了 --old 参数,它被替换为new --new 先前创建的参数。最后,我们用新的 new_argv 列表调用主函数。

请注意,如果原始 sys.argv 列表中不存在 --old 参数,此代码将不会修改 sys.argv 列表,并且 --new 参数将不会传递给主函数。

© www.soinside.com 2019 - 2024. All rights reserved.