Как я могу передать дату скрипту в Python? - PullRequest
5 голосов
/ 20 ноября 2011

У меня есть скрипт для удаления изображений старше даты.

Можно ли передать эту дату в качестве аргумента при вызове для запуска скрипта?

Пример: Этот скрипт delete_images.pyудаляет изображения старше даты (ГГГГ-ММ-ДД)

python delete_images.py 2010-12-31

Скрипт (работает с фиксированной датой (переменная xDate))

import os, glob, time

root = '/home/master/files/' # one specific folder
#root = 'D:\\Vacation\\*'          # or all the subfolders too
# expiration date in the format YYYY-MM-DD

### I have to pass the date from the script ###
xDate = '2010-12-31' 

print '-'*50
for folder in glob.glob(root):
    print folder
    # here .jpg image files, but could be .txt files or whatever
    for image in glob.glob(folder + '/*.jpg'):
        # retrieves the stats for the current jpeg image file
        # the tuple element at index 8 is the last-modified-date
        stats = os.stat(image)
        # put the two dates into matching format    
        lastmodDate = time.localtime(stats[8])
        expDate = time.strptime(xDate, '%Y-%m-%d')
        print image, time.strftime("%m/%d/%y", lastmodDate)
        # check if image-last-modified-date is outdated
        if  expDate > lastmodDate:
            try:
                print 'Removing', image, time.strftime("(older than %m/%d/%y)", expDate)
                os.remove(image)  # commented out for testing
            except OSError:
                print 'Could not remove', image 

Ответы [ 4 ]

17 голосов
/ 20 ноября 2011

Быстрый, но грубый способ - использовать sys.argv.

import sys
xDate = sys.argv[1]

Более надежный и расширяемый способ - использовать модуль argparse :

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('xDate')
args=parser.parse_args()

Затем для доступа к пользовательскому значению вы будете использовать args.xDate вместо xDate.

Используя модуль argparse, вы автоматически получаете бесплатное сообщение справки, когда пользователь вводит

delete_images.py -h

Также выдает полезное сообщение об ошибке, если пользователь не может ввести правильные данные.

Вы также можете легко установить значение по умолчанию для xDate, преобразовать xDate в datetime.date объект и, как говорят по телевизору, «намного, намного больше!».


Я вижу позже в вашем скрипте вы используете

expDate = time.strptime(xDate, '%Y-%m-%d')

для преобразования строки xDate в кортеж времени. Вы можете сделать это с argparse, так что args.xDate автоматически будет кортежем времени. Например,

import argparse
import time

def mkdate(datestr):
    return time.strptime(datestr, '%Y-%m-%d')
parser=argparse.ArgumentParser()
parser.add_argument('xDate',type=mkdate)
args=parser.parse_args()
print(args.xDate)

при запуске так:

% test.py 2000-1-1

выходы

time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)

PS. Какой бы метод вы ни выбрали (sys.argv или argparse), было бы неплохо потянуть

expDate = time.strptime(xDate, '%Y-%m-%d')

за пределами for-loop. Поскольку значение xDate никогда не меняется, вам нужно вычислить expDate только один раз.

3 голосов
/ 19 января 2015

Немного больше от ответа к ответу unutbu:

import argparse
import time

def mkdate(datestr):
  try:
    return time.strptime(datestr, '%Y-%m-%d')
  except ValueError:
    raise argparse.ArgumentTypeError(datestr + ' is not a proper date string')

parser=argparse.ArgumentParser()
parser.add_argument('xDate',type=mkdate)
args=parser.parse_args()
print(args.xDate)
2 голосов
/ 20 ноября 2011

Параметры командной строки доступны через список sys.argv.Таким образом, вы можете просто использовать

xDate = sys.argv[1]

(sys.argv[0] - имя текущего скрипта.)

0 голосов
/ 20 ноября 2011

вы можете использовать аргументы времени выполнения для этого подхода.Пожалуйста, смотрите следующую ссылку: http://www.faqs.org/docs/diveintopython/kgp_commandline.html

...