코드처럼 sys.argv에, 또는 라이브러리를 사용할 수 있습니다. 특히 흥미롭지는 않으며 의도적으로 단순합니다. 이것은 많은 프로그래머가이 문제를 해결하는 방법이 아니지만 더 많은 정보가 없으면 요구 사항을 충족시키는 것으로 보입니다.
나는 또한 당신이 파이썬을 처음 사용한다고 가정했다; 내가 틀렸다면이 글을 무시해도 좋습니다.
- 데이터베이스 자격 증명, 출력 디렉토리 및 날짜 (시작 및 종료)를 명령 줄에서 전달할 수 있습니다.
- os.system 대신 subprocess를 사용합니다. Subprocess는 Python에서 외부 실행 파일을 호출하는 기본 메커니즘을 제공합니다. 이 코드는 가장 간단한 것을 사용합니다. call()은 os.system()과 유사하므로
- optparse를 사용하여 명령 줄 인수를 처리합니다. 코드가 확실히 길고 장황하면, 장래에 arg 처리에 추가와 변경을 더 쉽게 할 수 있습니다. 또한 어떤 일이 일어나고 있는지 명확히 알 수 있습니다. 코드는 항상 작성된 것보다 훨씬 자주 읽혀집니다.
- 명령 줄 설정은 스크립트가
__main__
블록 내에서 실행될 때만 실행됩니다. 스크립트의 "논리"는 main() 메소드 내에 있기 때문에이를 가져 와서 다른 소스의 옵션 객체 (및 arg 목록)를 제공 할 수도 있습니다.
각 날짜를 별도의 파일로 출력해야 할 필요가 없으면 데이터베이스 엔진에서 SUM()을 계산하고 날짜별로 그룹화하도록 할 수 있습니다. 더 빠르고 더 간단한 코드를 생성 할 수있는 하나의 db 호출에서 모든 합계를 얻을 수 있습니다.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import datetime
import os
import subprocess
from optparse import OptionParser
SQL = """SELECT d.Date, SUM(d.CostUsd) FROM Stats d WHERE d.Date = '%s' GROUP BY d.Date"""
def get_stats(options, dateobj):
"""Return statistics for the date of `dateobj`"""
_datestr = dateobj.strftime('%Y-%m-%d')
sql = SQL % _datestr
filepath = os.path.join(options.outdir, 'DateLoop-%s.txt' % _datestr)
return subprocess.call('mysql -h %s -u %s -p -sN -e "%s" db > %s' % (options.dbhost, options.dbuser, sql, filepath), shell=True)
def main(options, args):
""""""
_date = options.startdate
while _date <= options.enddate:
rs = get_stats(options, _date)
_date += datetime.timedelta(days=1)
if __name__ == '__main__':
parser = OptionParser(version="%prog 1.0")
parser.add_option('-s', '--startdate', type='string', dest='startdate',
help='the start date (format: yyyymmdd)')
parser.add_option('-e', '--enddate', type='string', dest='enddate',
help='the end date (format: yyyymmdd)')
parser.add_option('--output', type='string', dest='outdir', default='/home/output/',
help='target directory for output files')
parser.add_option('--dbhost', type='string', dest='dbhost', default='myhost',
help='SQL server address')
parser.add_option('--dbuser', type='string', dest='dbuser', default='dbuser',
help='SQL server user')
options, args = parser.parse_args()
## Process the date args
if not options.startdate:
options.startdate = datetime.datetime.today()
else:
try:
options.startdate = datetime.datetime.strptime('%Y%m%d', options.startdate)
except ValueError:
parser.error("Invalid value for startdate (%s)" % options.startdate)
if not options.enddate:
options.enddate = options.startdate + datetime.timedelta(days=7)
else:
try:
options.enddate = datetime.datetime.strptime('%Y%m%d', options.enddate)
except ValueError:
parser.error("Invalid value for enddate (%s)" % options.enddate)
main(options, args)
MySQLdb 모듈 사용시 문제점은 무엇입니까? – alberge