zoukankan      html  css  js  c++  java
  • CommandLineParse类(命令行解析类)

    https://blog.csdn.net/jkhere/article/details/8674019

    https://sophia0130.github.io/2018/05/08/CommandLineParse%E7%B1%BB/

    https://blog.csdn.net/ylf_2278880589/article/details/80811304

    Java命令行选项解析之Commons-CLI & Args4J & JCommander

    CommandLineParser类:命令行解析

    这个类的出现主要是方便用户在命令行使用过程中减少工作量,可以在程序文件中直接指定命令行中的参数指令,方便了调试。

    1. C++ 例子:

     

    #include "opencv2/video/tracking.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
     
    #include <iostream>
    #include <ctype.h>
    #include <string>
     
    using namespace cv;
    using namespace std;
     
    const char* keys =
    {
        "{ c | camera | 0 | use camera or not}"
        "{ fn | filename |xxxx.avi | movie file}"
        "{ t | test | test string | good day!}"
    };
     
     
    int main(int argc, const char** argv )
    {
     
        CommandLineParser parser(argc, argv, keys);
        
        bool useCamera = parser.get<bool>("c");//括号里写成“camera”也可以
        string file = parser.get<string>("fn");
        string third = parser.get<string>("t");
     
        //打印输出
        cout<<useCamera<<endl;
        cout<<file<<endl;
        cout<<third<<endl;
        cout<<endl;
        parser.printParams();//CommandLineParser的成员函数,打印全部参数,还有其他成员函数,如:has(),getString()等
        return 0;
    }
    View Code

     

    运行结果:

     

     

    大概可以看出来用这个类的好处就是很方便,因为以前版本没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,并且输入的参数格式要与代码中的if语句判断内容格式一样,一不小心就输错了,很不方便。另外如果想要更改输入格式的话在主函数文件中要相应更改很多地方。现在有了这个类,只需要改keys里面的内容就可以了,并且可以直接运行,不需要cmd命令行带参运行。最后这个类封装了很多函数,可以直接用,只不过这个本来就是类结构的优点。
    ————————————————
    版权声明:本文为CSDN博主「JKhere」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jkhere/article/details/8674019

    2.更简单的c++例子:

     

    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    const char* keys =
    {
        "{input |C:/Users/king/Pictures/Saved Pictures/1.jpg| string |input image}"
    };
        //分别表示简称,文件来源,文件值和帮助语句    
    
    int main(int argc, char** argv)
    {
        Mat src, dst;
    
        const char* source_window = "Source image";
        const char* equalized_window = "Equalized Image";
    
        // Load image
        CommandLineParser parser(argc, argv, keys);
        src = imread(parser.get<String>("input"), IMREAD_COLOR);
        if (src.empty())
        {
            cout << "Could not open or find the image!
    " << endl;
            return -1;
        }
    
        cvtColor(src, src, COLOR_BGR2GRAY);
        equalizeHist(src, dst);
    
        namedWindow(source_window, WINDOW_AUTOSIZE);
        namedWindow(equalized_window, WINDOW_AUTOSIZE);
    
        imshow(source_window, src);
        imshow(equalized_window, dst);
    
        waitKey(0);
        return 0;
    
    }
    View Code

     

    1.这个类的作用

    以前没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,一不小心就输错了,很不方便。
    现在有了这个类,只需要改keys里面的内容就可以了,并且运行时可以直接在vs下用F5,不需要cmd命令行带参运行

    2.keys

    keys中间的内容分成4断,用”|”分隔开,分别表示简称,文件来源,文件值和帮助语句 PS:文件的值我不是很理解,如果类型是bool,那就有值0或,如果是类型是图像,它的值可以省略,我这边文件的值用了string,也运行成功了。

     

    3. Java构建命令行启动模式CommandLineParser/Options

    public void parseArgs(String[] args) throws ParseException {
        // Create a Parser
        CommandLineParser parser = new BasicParser( );
        Options options = new Options( );
        options.addOption("h", "help", false, "Print this usage information");
        options.addOption("c", "cfg", true, "config Absolute Path");
        options.addOption("l", "log", true, "log configuration");
    
        // Parse the program arguments
        CommandLine commandLine = parser.parse( options, args );
        // Set the appropriate variables based on supplied options
    
        if( commandLine.hasOption('h') ) {
            printHelpMessage();
            System.exit(0);
        }
        if( commandLine.hasOption('c') ) {
            cfg = new File(commandLine.getOptionValue('c'));
        } else {
            printHelpMessage();
            System.exit(0);
        }
        if( commandLine.hasOption('l') ) {
            log = new File(commandLine.getOptionValue('l'));
        } else {
            printHelpMessage();
            System.exit(0);
        }
    }
    public void printHelpMessage() {
        System.out.println( "Change the xml File and Log.XML Path to the right Absolute Path base on your project Location in your computor");
        System.out.println("Usage example: ");
        System.out.println( "java -cfg D:\MyProject\face2face\logic\src\main\resources\logic.xml  -log D:\MyProject\face2face\logic\src\main\resources\log.xml");
        System.exit(0);
    }
    View Code

    在上述代码中

    options.addOption("c", "cfg", true, "config Absolute Path"); //第三个参数为true表示需要额外参数:
           linux 命令行约定:
           几乎所有的GNU/Linux程序都遵循一些命令行参数定义的约定。程序希望出现的参数可以分成两种:选项(options or flags)、其他类型的的参数。Options修饰了程序运行的方式,其他类型的参数则提供了输入(例如,输入文件的名称)。
           对于options类型参数可以有两种方式:
           1)短选项(short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母)。例如:-s,-h等。
           2)长选项(long options):长选项,包含了两个连字号和一些大小写字母组成的单词。例如,--size,--help等。
           *注:一个程序通常会提供包括short options和long options两种参数形式的参数。
      以上代码中的"c"和"cfg"就是短选项和长选项.

    如定义:

    String[] arg = {"-t","-c","hello"};//这里参数c在下面定义为需要额外参数,这里是"hello"
    public void testOption(String[] args) throws ParseException{
    
    Options options = new Options();
    options.addOption("t",false,"display current time");
    options.addOption("c",true,"country code");
    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = parser.parse( options, args);
    if(cmd.hasOption("t")) {
    System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())+" in "+cmd.getOptionValue("c"));//这里调用cmd.getOptionValue("c")会输出hello     
    }else{
    System.out.println((new SimpleDateFormat("yyyy-MM-dd")).format(new Date()));
    }} 
    View Code

    ————————————————
    版权声明:本文为CSDN博主「静心安心」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ylf_2278880589/article/details/80811304

  • 相关阅读:
    iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent
    iOS AR技术初体验,使用EasyAR示例程序的小白指南
    导入GPUImage,实时滤镜相机,GUPImage遇到的问题解决,_OBJC_METACLASS_$_GBGPUImageView in GBGPUImageView.o
    iOS 除去图片的白色背景(接近白色),或者其它颜色的替换,获取像素点的ARGB值
    用const取代宏定义更好的管理内存
    一些字体设计的练习
    Appium 解决锁屏截屏问题(java篇)
    解决Appium无元素可选的如何定位(java篇)
    解决Appium 抓取toast(java篇)
    Appium 解决手势密码 (java篇)
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/11458950.html
Copyright © 2011-2022 走看看