2013-08-29 2 views
1

я в настоящее время изучает 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) 

еще: печать (args.direct) только для тестирования, пока я не достичь желаемого поведения.

Любые другие замечания/предложения приветствуются, так как я новичок в python.

ответ

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)) 
+0

Да, default = meta будет делать дерево, я думаю, с некоторыми изменениями, спасибо! :) – yaku

1

Сделать -d простым аргументом «магазина» со значением по умолчанию.

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

Затем используйте args.direct в качестве пути для передачи glob.glob.

+0

Да, хотя это было так просто, я не мог понять это сам. : P – yaku

1

Использование два OPTIONALS аргументов позволяет вашему пользователю указать каталог и расширение в любом порядке, или определить, и пусть другие будут по умолчанию:

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

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

входов, продуцирующие те же пространства имен будет '', 'otherdir', 'otherdir txt'. В этом случае указание ext зависит от задания dir.

Я не думаю, что аргумент store_true-d добавляет ничего к определению.

Смежные вопросы