Python optparse - 选项未被识别为假

2 投票
1 回答
815 浏览
提问于 2025-04-17 23:20

我对Python还比较陌生,正在玩optparse这个库。我有一个解析函数,代码如下:

def parse(argv):
    """Option parser, returns the options leave the args."""
    version = '0.1'
    usage = 'Usage: %prog [options] -f|--file <FILENAME>'
    parser = optparse.OptionParser(usage=usage,version="%prog: v.{}".format(version))
    parser.add_option("-m", "--mock",
            action="store_true", dest="fake", default=False,
            help="Mock the file and export to stdout")
    parser.add_option("-t", "--test",
            action="store_true", dest="test", default=False,
            help="Test the file against RocketAnalysis.m after completion")
    parser.add_option("-d", "--dir",
            dest="save_dir", default=os.getcwd(), metavar="DIR",
            help="Change save directory to DIR [Default: current dir]")
    parser.add_option("-f", "--file-name",
            dest="filename", default=None, metavar="FILENAME",
            help="FILENAME to create variables under [ REQUIRED ]")
    parser.add_option("-v", "--verbose",
            action="store_true", dest="verbose", default="False",
            help="Verbose prints enabled")
    parser.add_option("-q", "--quiet",
            action="store_true", dest="quiet", default="False",
            help="Turns on quiet mode with no prints or feedback except errors")
    parser.add_option("-c", "--clober",
            action="store_true", dest="clobber", default="False",
            help="Clobber FILENAME and re-write")
    (options, args) = parser.parse_args()
    return options

我是在主函数中调用这个解析函数的(我也把它放在主函数里,以防这就是问题所在,但其实不是),然后使用verbose选项来列出所有选项及其值:

    options = parse(argv)
    file_path = "{}/{}".format(options.save_dir,options.filename)
    print("Is verbose? %s" % options.verbose)
    if options.verbose:
        opts_dic = vars(options)
        print("Options set:")
        for k, v in opts_dic.iteritems():
            print("\t{} : {}".format(k, v))
        print("\tFile path set to: {}".format(file_path))

结果是:

./create_stage.py -f this.txt
Is verbose? False
Options set:
    verbose : False
    fake : False
    quiet : False
    clobber : False
    filename : this.txt
    save_dir : /home/silas/Documents/ksp/ksp-octave
    test : False
    File path set to: /home/silas/Documents/ksp/ksp-octave/this.txt

所以,尽管它知道verbose是假的(通过print("Is verbose? %s" % options.verbose)显示为false),它还是执行了verbose的if块(if options.verbose:)。我是不是漏掉了什么步骤?正如我所说的,即使我把解析器放在主函数里,argv也是通过main(sys.argv)传入的。这种情况会不会因为切换到argparse而解决,尽管在optparse中应该是可以正常工作的?任何帮助都很不错。

我使用的是Python 2.7.5以上版本。

1 个回答

3
parser.add_option("-v", "--verbose",
        action="store_true", dest="verbose", default="False",
        help="Verbose prints enabled")

字符串 "False" 是“真”的,因为它是一个非零长度的字符串。你可以试试:print(bool("False"))。所以你设置的默认值 verbose 是“真”的。记得用默认值 False,而不是 "False"

撰写回答