from datetime import datetime

# return : string '2020-03-01'
def gettoday():
    today = datetime.today().strftime("%Y-%m-%d")
    return today

# start_date : string  '2020-03-01'
# end_date : string  '2020-03-04'
# return : int  : 3
def get_datediff(start_date, end_date):
    betday = datetime.strptime(end_date,"%Y-%m-%d").date() - datetime.strptime(start_date,"%Y-%m-%d").date()
    return betday.days


if __name__ == "__main__":
    print(gettoday() )
    betday = get_datediff( '2020-03-01' , gettoday() )
    print( betday )

 

  간단하게 파이선으로 오늘 날짜를 구하고 두개 날짜의 차이를 구하는 함수

  날짜로 배치작업을 돌려야 할때 요긴하게 사용가능해 보인다. 다른 방법도 많지만.. 


#간단한게 가장 좋다.

  윈도우즈에서 Pycharm을 사용해서 개발을 하는 경우가 종종 있다. PyCharm으로 개발은 하였지만 실제 코드가 동작하는 환경은 리눅스이기 때문에 이를 옮겨 주어야 한다. 

 

  이때 PyCharm의 편리한 기능중 하나인 Python 가상 환경으로 개발을 진행할수 있다.

  다만 이때 윈도우즈에서 가상환경으로 개발을 진행하게 되면 가상 환경의 실행 파일들이 모두 윈도우즈 exe 파일로 설치되게 된다. 이렇게 개발된 가상환경을 바로 유닉스 환경에서는 실행이 되지 않고 당연히 별도의 가상 환경을 해당 유닉스 시스템에 만들어 준 이후에 해주어야 한다. (윈도우즈의 가상 환경을 바로 이동 시킬수 있는 방법이 있는지는 모르겠다.)

 

   이때 해당 파이선 버전의 환경은 가상환경으로 유닉스상에서 만들기 편하지만 라이브러리의 경우에는 모두 이동을 해주어야 한다.

 

  여러가지 의존성들이 설치된 상태

 

  이때 아래의 명령어를 이용해서 간단하게 의존성을 추출하고 설치를 진행 할수 있다.

 

  방법

1. PyCharm 상에서 터미널창을 연 다음 아래의 명령어 수행

 

  > pip freeze > requirements.txt

 

2. requirements.txt 로 위의 버전 정보 추출 확인

 

beautifulsoup4==4.8.1
html5lib==1.0.1
lxml==4.4.2
numpy==1.17.4
pandas==0.25.3
psycopg2==2.8.4
python-dateutil==2.8.1
pytz==2019.3
singleton==0.1.0
six==1.13.0
soupsieve==1.9.5
webencodings==0.5.1

 

3. 유닉스 환경에서 아래의 명령어들을 이용하여 가상 환경 생성

 

> python -m venv env --without-pip

  (--without-pip 옵션은 제거하여도 된다. 에러가 난다면 추가한다.)

> source env/bin/activate

> pip install -r requirements.txt

 

pip가 제대로 설치되지 않아 --without-pip를 설정하였으므로 pip가 설치되지 않은 상태이므로 아래의 명령어로 설치해준다.

> curl https://bootstrap.pypa.io/get-pip.py | python

 

  이제 윈도우에서 개발한 환경 그대로 사용이 가능해 질 것이다.

전문적으로 Python으로 개발하지 않더라도 Python으로 이것저것 개발하거나 혹은 인터넷이나 Github상에서 다운로드한 소스코드를 동작해야 할 일이 꽤 많을 것이다.  그럴때 아래와 같이 잘 예외 처리가 된 코드를 보았다고 생각해 보자..


    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


  단지 파일의 내용을 읽은 다음 단순히 리스트에 하나씩 넣어주는 단순한 코드 이다.

 근대 위의 코드를 실행해 보면 아래와 같이 에러가 난다.



[!] Could not access file ./usernames.txt


예외처리가 되어 있어 아무런 에러 메시지가 나지 않는다. 제일 쉬운 에러 메시지를 보는 방법은 try, except를 모두 제거 해버리면 된다. 그러나 열심히 짜둔 코드를 에러 하나 보겠다고 즉 Stack Trace 하나 하겠다고 지우고 다시 짜기엔 귀차니즘이 용납하지 않는다. 이럴때 에러 로깅을 한가지 넣어서 해결 해 보자.


아래와 같이 코드를 수정한다.


    import traceback

    lineList = []

    try:

        f = open(fileName, 'r', encoding='latin-1')


    except IOError:

        print("[!] Could not open file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    except:

        print("[!] Could not access file " + fileName)

        traceback.print_stack()

        traceback.print_exc()

        exit(1)


    for line in f.readlines():

        newLine = line.replace('\n', '')

        lineList.append(newLine)


   위와 같이 변경하고 나면 아래와 같이 encoding이 잘못된 키워드로 함수내에 정의되었다는 에러 메시지를 볼수 있다.


TypeError: 'encoding' is an invalid keyword argument for this function


  위에서 사용한 traceback은 python상에서 위와 같이 예외처리등이 수행된 상태에서 Stack Trace를 출력하기에 상당히 유용한 모듈이다. 상세한 설명은 아래의 링크를 참고하기 바란다.


https://docs.python.org/2/library/traceback.html


This module provides a standard interface to extract, format and print stack traces of Python programs. It exactly mimics the behavior of the Python interpreter when it prints a stack trace. This is useful when you want to print stack traces under program control, such as in a “wrapper” around the interpreter





+ Recent posts