对于小型命令行应用程序,我可以使用简单的命令行输入。
./test input.png output.png
但是对于需要大量输入的大型应用程序来说,简单地使用命令行很快就会变得混乱不堪。
./测试cam1.png cam1_focal cam1_principle_x cam1_principle_y cam1_k1 cam1_k2 cam2_k1 . cam2_focal cam2_principle_x cam2_principle_y cam2_k1 cam2_k2 .cam15_focal cam15_principle_x cam15_principle_y cam15_k1 cam15_k2 output.png
处理这一问题的典型方法是什么?我听到我的朋友提到要把所有的输入参数写到XML或JSON文件中,所以它会变成如下所示
/测试config.xml
或
/测试config.json
应用程序将解析XML文件或JSON文件以获得正确的输入。
如果他是对的,如果我首先选择一个,我应该使用XML还是JSON?
如果他错了,怎样才能正确地处理大量的投入?
编辑:理想情况下,这个方法应该是
发布于 2017-09-17 08:20:36
在处理命令行程序时,有两种约定使我们(和程序)能够有效地处理大量的参数。
--focal=<some value> --principle_x=<some value> --principle_y=<some value> -o <output file>形式的。这允许参数成为可选的,并重新排序参数。按照惯例,输入文件可以作为位置参数(在所有其他参数之后)提供。对于大多数程序来说,这两个约定就足够了,因为通常相同的命名参数集适用于所有输入文件。
如果您有更复杂的需求,例如不同输入的不同参数值,则可以
<global options> <input1> <input1 options> <input2> <input2 options> ... <global options>。这意味着可以多次指定像--focal这样的选项,并且总是将其应用于最近在命令行中看到的图像。发布于 2017-09-17 05:10:30
有几件事情可以使用户更容易做到这一点。其中之一就是有名字的论点。例如,如果您查看Unix "find“命令,您将写入参数的名称,然后它的值如下:
find <directory to find in> -name <name pattern> -print要匹配的名称的参数称为"-name“。
如果您确实想要一个包含参数的文件,那么一个命名它们的文件是有帮助的。像带有节、键和值的.ini文件这样简单的东西很容易实现:
imageFile = cam1.png
cam1Focal = 75
cam1_principle_x = 100
cam1_principle_y = -64
... etc.这允许文件的读者快速找到他们想要更改的值,并允许不熟悉格式的人有更好的机会理解它。这也可以用于XML或JSON,特别是如果您已经有了一个库来读取这些格式。
另一个要问的问题是,为什么你需要这么多投入。向用户提供一个用户界面,让他们可以选择选项,默认设置是显而易见的,这是否更有意义呢?或者这个应用程序通常是从另一个应用程序调用的,所以参数总是生成而不是输入?如果是这样的话,那也许就无关紧要了。(嗯,正如注释中指出的,您仍然需要进行错误处理,但可读性不是一个因素。)
你也不必在两者之间做出选择。您可以像其他命令一样从命令行执行和接受参数,允许一个参数作为包含其他参数的文件的路径(如"-c < config file >"),或者有一个参数将应用程序设置为“交互式”模式(如Unix上的"rm -i“),并提示用户或任何适当的参数。
发布于 2017-09-16 23:43:46
实际上,我会选择比JSON或XML更简单的文件格式。使用每一行只有一个参数的文本文件。没有必要用JSON或XML使事情过于复杂。
因此,您的文本文件config.txt将有:
cam1.png
cam1_focal
cam1_principle_x
cam1_principle_y
cam1_k1
cam1_k2
cam2.png
cam2_focal
cam2_principle_x
cam2_principle_y
cam2_k1
cam2_k2
...
cam15.png
cam15_focal
cam15_principle_x
cam15_principle_y
cam15_k1
cam15_k2
output.png然后使用./test config.txt运行程序。
显然,如果您想要更丰富的设置,而不是每行格式所能提供的这个参数,那么您可以考虑使用JSON或XML。
https://softwareengineering.stackexchange.com/questions/357543
复制相似问题