以不同的方式使用argparse参数

时间:2013-08-29 14:39:14

标签: python-3.x argparse

我正在研究argparse模块,我希望我的程序行为如下:

$ python cldir.py # this should delete all .meta files in ~/downloads 

$ python cldir.py -d /path/name/ # delete all .meta files in /path/name

$ python cldir.py -d /path/name -e txt # should delete all .txt files in /path/name

现在,我知道我需要为文件扩展名使用另一个参数(在本例中为-e),但我想知道如何使-d开关的行为如上所示。

到目前为止,这是我的代码:

#!/usr/bin/env python

import argparse
import os
import glob

version = "0.1.1"

parser = argparse.ArgumentParser(
    description = 'cldir: clear a directory from .meta and other unwanted files')

# arguments list

parser.add_argument('-v', '--version', action='version', version = version)

parser.add_argument('-d', '--direct', action = 'store_true')

args = parser.parse_args()

if args.direct == False:
    path = os.environ['HOME'] + '/downloads/'
    files = glob.glob(path + '*.meta')

    if len(files) == 0:
        print('No .meta files found in ~/downloads')
    else:
        for f in files:
            os.remove(f)
    print('%d file(s) deleted' %len(files))

else:
    print(args.direct)

else:print(args.direct)仅用于测试,直到我达到所需的行为。

我非常欢迎任何其他意见/建议,因为我是python的新手。

3 个答案:

答案 0 :(得分:1)

使-d成为一个带有默认值的简单'store'参数。

parser.add_argument('--direct', '-d', default=os.environ['HOME'] + '/downloads/')

然后使用args.direct作为传递给glob.glob的路径。

答案 1 :(得分:1)

使用-d让用户提供路径。您可以使用default参数设置默认路径。同样,您可以将-e选项的默认值设置为'meta'

import argparse
import os
import glob

version = "0.1.1"

parser = argparse.ArgumentParser(
    description = 'cldir: clear a directory from .meta and other unwanted files')

# arguments list

parser.add_argument('-v', '--version', action='version', version = version)

parser.add_argument('-d', '--directory', default=os.path.expanduser('~/downloads'),
                    help='directory to be cleaned')

parser.add_argument('-e', default='meta', help='extension')

args = parser.parse_args()
print(args)
path = os.path.join(args.directory)
files = glob.glob(path + '*.{}'.format(args.e))

if len(files) == 0:
    print('No .meta files found in ~/downloads')
else:
    for f in files:
        os.remove(f)
    print('%d file(s) deleted' %len(files))

答案 2 :(得分:1)

使用两个选项参数,您的用户可以按任意顺序指定目录和扩展名,或指定一个,并让另一个作为默认值:

p.add_argument('-d','--dir',default='default_dir')
p.add_argument('-e','--ext',default='meta')

Input: '' produces: Namespace(dir='default_dir', ext='meta')
'-d otherdir' => Namespace(dir='otherdir', ext='meta')
'-d otherdir -e txt' => Namespace(dir='otherdir', ext='txt')
'-e txt' => Namespace(dir='default_dir', ext='txt')

可以在-e之前或之前阻止使用-d,但可能不值得额外的代码。但是它是使用positionals的默认行为。

或者两个论点可能是'?' positionals

p.add_argument('dir',default='default_dir',nargs='?')
p.add_argument('ext',default='meta',nargs='?')

生成相同名称空间的输入将是'''otherdir''otherdir txt'。在这种情况下,指定ext取决于指定dir

我认为store_true -d参数不会在定义中添加任何内容。