我正在研究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的新手。
答案 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
参数不会在定义中添加任何内容。