【发布时间】:2016-09-15 18:23:03
【问题描述】:
我想支持子命令 CLI 模型,就像 git 使用的那样,我遇到问题的特定位是“更改目录”选项。像git 一样,我想要一个-C DIR 选项,它会在执行子命令之前将程序更改为指定的目录。不是真正的问题,使用子解析器,但是我还想使用argparse.ArgumentParser(fromfile_prefix_chars='@') 机制在在解析过程中应用-C DIR 参数之后。
问题来了:fromfile 参数扩展是由 argparse 在所有其他参数处理之前执行的。 因此,任何此类 fromfile 参数必须使用绝对路径或相对于调用解析器时的 CWD。我不想要绝对路径;我“需要”使用与-C DIR 选项相关的fromfile 路径。我写了我自己的class ChdirAction(argparse.Action) 来做到这一点。它工作得很好,但由于 fromfile 参数已经扩展,它没有给我想要的东西。 (在发现这种 not-what-I-want 行为后,我查看了 python3.5/argparse.py 并发现同样的挫败感嵌入在冷酷、坚硬、无情的代码中。)
这是一个目录图,可能有助于解释我想要什么:
/ foo / aaa / iii / arg.txt
| |
| + jjj / arg.txt
| |
| + arg.txt
|
+ bbb / iii / arg.txt
|
+ jjj / arg.txt
在解析命令行参数时,考虑 CWD 是 aaa 还是 bbb。如果我运行类似prog -C ./iii @arg.txt
我希望解析器使用来自/foo/aaa/iii/arg.txt 的参数扩展@arg.txt。实际发生的是fromfile 从/foo/aaa/arg.txt 的内容扩展而来。当 CWD 为 /foo/aaa 时,这是“错误”文件;当/foo/bbb 它引发“错误:[Errno 2] 没有这样的文件或目录:'arg.txt'”
更一般地说,prog -C ./DIR @arg.txt 应该从 /foo/aaa/DIR/arg.txt 扩展,即使 fromfile 具有“向上目录”部分,例如prog -C ./iii @../arg.txt 应该从 /foo/aaa/arg.txt 扩展。
如果可以使这种行为发生,那么我可以 -C DIR 到 {aaa,bbb}/{iii,jjj} 中的任何一个,并从通用命令行构造中获得一致的行为。
如上所述,我的问题不是什么大问题。如果能提供-C DIR,通过参数解析后的os.chdir(DIR)实现,那么我也可以构造合适的fromfile参数。它们可以是绝对的或相对于 CWD 解析时(在任何 -C DIR 生效之前)。这可能看起来像:
cd /foo/aaa; prog -C ./DIR @arg.txt @./DIR/arg.txt
我不喜欢它,但没关系。 REAL 问题是我使用的实际更改目录参数更像-C PATTERN。在我真正的问题案例中,PATTERN 可能是一个简单的路径(绝对或相对)。或者,它可能是一个 glob 模式,或者具有“非平凡”解析逻辑的部分名称,用于查找 os.chdir(DIR) 的实际目录。在这种情况下(我正在努力解决),我不能让程序的调用者解析 fromfile 路径的实际位置。
实际上,我可以, 但这会给调用者带来不适当的负担。而且,当那个调用程序是一个 Eclipse 启动程序时,我真的没有必要的控制流能力来做到这一点。所以,它又回到了让程序照顾自己的需求;一个更好的抽象,但是我该如何实现它?
【问题讨论】: