我想支持一个子命令 CLI 模型,就像使用的那样git
我遇到问题的特定位是“更改目录”选项。就像git
,我想要一个-C DIR
选项,在执行子命令之前将程序更改为指定目录。不是真正的问题,使用子解析器,但我也想在解析期间应用参数后使用该argparse.ArgumentParser(fromfile_prefix_chars='@')
机制。-C DIR
这是问题所在:fromfile
参数扩展是argparse
在所有其他参数处理之前执行的。因此,任何此类fromfile
参数都必须使用绝对路径,或者在调用解析器时相对于 CWD 的路径。我不想要绝对路径;我“需要”使用与选项相关的fromfile
路径。我写了自己的来做显而易见的事情。它工作得很好,但由于参数已经扩展,它没有给我我想要的东西。(在发现这种不是我想要的行为后,我查看并发现同样的挫败感嵌入在冰冷、坚硬、无情的代码中。)-C DIR
class ChdirAction(argparse.Action)
fromfile
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
我希望解析器@arg.txt
使用来自/foo/aaa/iii/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
参数。它们在解析时(在任何-C DIR
生效之前)可以是绝对的或相对于 CWD 。这可能看起来像:
cd /foo/aaa; prog -C ./DIR @arg.txt @./DIR/arg.txt
我不喜欢它,但没关系。真正的问题是我使用的实际更改目录参数更像-C PATTERN
. 在我真正的问题案例中,PATTERN 可能是一个简单的路径(绝对或相对)。或者,它可能是一个 glob 模式,或者是具有“非平凡”解析逻辑的部分名称,用于查找os.chdir(DIR)
. 在这种情况下(我正在努力解决),我不能让程序的调用者解析fromfile
路径的实际位置。
实际上,我可以,但这会给调用者带来不适当的负担。而且,当那个调用程序是一个 Eclipse 启动程序时,我真的没有必要的控制流能力来做到这一点。所以,它又回到了让程序照顾自己的需求;一个更好的抽象,但我该如何实现呢?