반응형

개요

 메모장과 python만 있어도 충분히 프로그램을 만들 수 있다(어셈블러는 지금도 이렇게 하기도 한다). 하지만, 프로그램 언어에 대해서 검사를 해주는 많은 개발 도구들이 있는데, 굳이 이를 사용하지 않고 개발할 이유가 없다. 특히 숙련된 프로그래머 조차도 오타로 인해서 버그나 에러가 발생하는 경우가 많다.때문에 이를 방지하기 위해서 문법 검사, 문법 하이라이트 및 디버그 도구를 사용할 수 있는 통합개발환경(IDE)를 사용하는 것을 권장한다.

 윈도우 환경에서 Python을 설치한 경우 기본적으로 제공되는 Python IDLE이 있고, 가장 강력한 PyCharm, 가벼우나 확장기능으로 범용으로 사용되는 Visual Studio Code 등 다양한 개발 도구들이 있다.

함수나 class 를 배우기 전까지는 IDLE(유닉스 환경에서는 터미널에서 python을 입력하여 보이는 화면을 사용하면 된다.) 를 사용하여 실습을 진행해도 충분하다. class 이후부터는 개발 툴을 사용하는 것을 권장하는데, 여기서는 가벼운 Visual Studio Code(줄여서 VS Code)를 사용할 것이다.

IDEL Shell

Windows OS에서는 IDEL Shell 이라는 별도의 간단한 인터프리터 환경을 제공한다. 물론 다른 유닉스 환경에서는 터미널에서 'python' 혹은 'python3' 명령어를 입력하여 진입이 가능하다. Windows 역시 IDEL Shell 없이 명령프롬프트 혹은 Power Shell을 통해서 진입이 가능하다.

문법에 대해서 바로 확인이 가능한 환경이기 때문에 소스코드를 작성하다가 간단한 문법이 생각 안날 경우 사용해도 괜찮다. 다만, 복잡한 함수와 클래스를 다루게 될 경우 오히려 불편하므로 초기 파이썬 입문할때 주로 많이 사용하게 된다.

VS Code 설치

웹 브라우저에 구글로 vs code를 검색하거나 code.visualstudio.com 을 접속하면 된다. 보통은 웹 브라우저가 사용자의 컴퓨터의 OS를 인식하여 알맞는 VS Code 버전을 보여준다. 설치 과정은 특별한 것은 없다.

VS Code Extension

VS Code는 기본적으로 확장 가능한 간단한 텍스트 편집기이다. 개발도구로 사용하기 위해서는 확장 기능을 설치하면 된다. 그리고 확장 기능들은 MS외에도 다양한 개발사 혹은 개인 개발자들이 만들었다. 만약 원하는 기능이 없는 경우 관련 문서를 참조하여 자신이 직접 만들 수 도 있다.

Python을 위한 기본 확장기능으로 python(microsoft), Pylance(microsoft), isort(microsoft) 를 최소한을 설치하면 된다. 이외 관련된 추가 기능은 어떤 기능인지 확인하고 나서 추가를 하면 된다.

그 외 디버깅을 위해서는 code runer(jun Han)을 추가로 설치하면 좋다. 디버깅 과정은 .py 파일로 프로그램을 만들었을 경우 에러를 찾는 용도로 용이하다.

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
파이썬 3 설치  (0) 2024.04.22
배경이 있는 파이썬  (0) 2024.02.22
반응형

개요

Windows 를 제외하면 대부분의 OS(주로 유닉스 계열로 리눅스로 불리는 것들과 OS X라 불리는 apple 에서 만든 OS들)는 기본적으로 Python3가 설치되어 있다. 이 때문에 입문시 초기 파이썬 설치는 Windows 에서만 진행하면 된다.

다운로드

 구글에서 python 으로 검색하거나 주소창에 python.org 를 직접 입력하여 접속을 해도 된다. 다운로드 받을 수 있는 버전은 시기에 따라서 차이가 있다. 현직 개발자가 아니거나 입문자라면 최신버전을 받아도 무난하다.

 python 3.10 부터 많은 부분이 변화 되었기 때문에 하위 호환이 안되는 경우가 있다. 대신에 이러한 변호로 인해 python이라는 언어가 더 급진적으로 발전하게 된다. C#의 경우 2년만에 2.0 에서 6.0 까지 버전업을 한 사례도 있다.

 

설치

다운로드 받은 파일을 실행하면 python을 설치할 수 있다. 처음 python을 설치한다면 이 때 하단의 Add python.exe to PATH 항목을 체크하고 나서 install Now 부분을 클릭하여 설치를 진행하면 된다.

Add python.exe to PATH의 의미

원도우즈 뿐만 아니라 대부분의 운영체제에서는 '환경변수'라는 것이 존재한다. 이 환경변수내에 파일 경로 혹은 폴더 경로가 설정되어 있다면, 해당 파일 경로가 아닌 곳에서도 프로그램을 실행할 수 있다.

즉, 우리가 앞으로 만드는 python 소스코드를 python.exe (혹은 python.out)을 통해서 실행되기 위해서는 환경변수에 추가 되어야 아래와 같이 간단하게 실행할 수 있다.

# ${} 은 보통 글자 내용에 해당하는 특정한 값을 의미함
python.exe ${python source code file path}

만약 환경변수에 등록을 하지 않았다면 다음과 같이 실행을 해야한다.

c:\users\${user}\AppData\Local\Programs\Python\Python311\python.exe ${python source code file path}

설치 확인

버전 확인

명령 프롬프트 혹은 Power shell 에서 다음 명령어를 실행하면 된다. 실행 결과로 버전 정보가 나오면 정상적으로 설치가 된 것이다. 정상적으로 확인 되었다면 실습 준비가ㄷ된 것이다.

 

python --version

명령 프롬프트 열기

윈도우 키를 누르고 cmd를 입력하면 '명령 프롬프트'가 보인다. 이를 클릭하여 실행하면 된다.

power shell 열기

윈도우 키를 누르고 power shell을 입력하면 power shell 이 보인다. 이를 클릭하여 실행하면 된다.

반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
배경이 있는 파이썬  (0) 2024.02.22
반응형

작성 계기

요즘에는 회사에서 신입이나 인턴을 받게 되면 대부분 파이썬 언어를 써본적이 있다. 그래서 파이썬을 통해서 간단한 작업을 요청을 해도 너무나 오래 걸리는 경우를 많이 겪었다. 심지어 석사과정을 마쳤고 석사과정 중 논문을 위해 파이썬을 썻던 사람임에도 불구하고 이런 경우가 종종 있다. 왜 이런일이 생기는가 생각해보게 되었다.

 그 결과 파이썬 입문서는 이미 많이 있는데, 배부분 파이썬 문법과 언어에만 초점이 맞춰져 있다 보니 배경을 모르는 상태에서 암기를 한 결과가 아닐까 싶다. 그리고 문법에 초점을 맞추다 보니 배경 설명이 생략이 되고 문법위주로 설명하다 보니 필요성에 대해서 이해를 못 한 것이 아닐까 싶다. 물론 프로그래머 같은 전문가가 되고자 할 경우에는 작은 주요내용을 봐두는 것이 향후 실무에 도움이 된다는 것에 대해서는 동의한다.

 하지만 프로그래밍 언어들의 문법들은 어느날 갑자기 생겼다기 보다는 컴퓨터라는 기계가 발명된 이래 수 많은 엔지니어들의 경험이라는 배경속에서 프로그래밍 언어가 만들어져 왔고 기존 언어에서 새로운 문법이 추가되기 도 한다. 특히나 파이썬이 발전하는 속도도 과거에 비해서 많이 빨라지고 있다.

 배경 없이 프로그래밍 언어만 공부한다면 입문자에게는 단순히 암기해서 사용하는 언어에 불과하다. 이러한 암기는 잊기도 쉽고 이해하기도 어렵다. 때문에 가능하면 이러한 배경에 대해서 기록 하려고 했다.

그리고 입문자라면 가져야 하는 자세가 입문을 순차적으로 보고 난 다음 다시 정의 된 내용을 확인하는 것을 강하게 권장한다. 자신이 이해를 하기 위해서 다른 서적을 이용해도 상관이 없다.

여기서 입문, 초금, 중급 이렇게 3단계로 나누어서 서술할 계획이다. 이중 초급만 되도 어느정도 간단한 스크립트 형태의 프로그램은 충분히 작성할 수 있을 것이다(그리고 이건 필자의 기준이기도 하다). 고급이 없는 이유는 고급정도라면 이런 문서를 볼 필요가 없고, 시시각각 프로그래밍 언어에 대해서 결정하는 포럼에서 활동해야 하기 때문이다. 아니면 파이썬 자체를 발전시키기 위해 기여할 것이다. 그리고 그 조건으로 아마 C 도 능통해야 할 것이다. 이는 파이썬이 C로 만들어졌기 때문이다.

이 글을 쓴 시점에는 이미 개인 Notion으로 초급 중반까지 작성하고 옮겨 적으면서 수정하는 것이다.

목차

입문

  1. 파이썬 설치
  2. 개발 환경 만들기
  3. 변수(variable)와 상수(constant)
  4. 숫자형(int, float)
  5. 문자 code
  6. 문자열(str)
  7. 리스트(list)
  8. 튜플(Tuple)
  9. 딕셔너리(dict)
  10. 불리언(boolean)
  11. 조건문(if)
  12. 반복문(while, for)
  13. 함수(function)
  14. 모듈(module)
  15. 클래스(class) 입문
  16. 클래스로 보는 자료형
  17. 파일시스템

초급

  1. 내장함수
  2. csv 파일 응용
  3. 예외처리
  4. 클래스 초급
  5. 정규표현식
  6. 간단한 스크립트 만들기
  7. yield와 generater
  8. 자료형 관리
  9. 주피터 노트북
반응형

'Python > 배경이 있는 파이썬' 카테고리의 다른 글

문자 code  (0) 2024.04.24
숫자형(int, float)  (0) 2024.04.24
변수(variable)와 상수(constant)  (0) 2024.04.23
개발 환경 만들기  (0) 2024.04.22
파이썬 3 설치  (0) 2024.04.22
반응형

list boolean 판별 all, any

배경

Python의 가장 큰 매력은 있으면 편할 것 같은 내장함수가 많다는 것이다. 종종 여러요소들을 검사할 경우 검사 결과에 대해서 list에 담아서 확인을 하고 싶은 경우가 있다. 경우에 따라 모두 True이어야 하거나 하나라도 True 인 경우가 필요하다면, all()과 any() 내장 함수를 사용하면 된다.

사용 조건은 iterable (반복자 사용가능)으로 즉, 좀 더 쉽게 접근하자면 for in 문 사용이 가능한 list 같은 자료구조에 사용할 수 있다.

 

all()

입력받은 list 인스턴스중 모두다 True 이여야 True 값을 반환한다. 즉, 각 list내의 boolean 값이 각각 and 논리연산을 한 것과 같다.

a = [True, True, True]
b = [True, False, True]
all(a)
# True
all(b)
# False

 

any()

입력받은 list 인스턴스중 하나라도 True이면 True를 반환한다. 각 list내에 boolean 값이 각각 or 논리연산을 한 것과 같다.

a = [False, False, False]
b = [True, False, False]
any(a)
# False
any(b)
# True

 

 

반응형
반응형

datetime, timestamp, str 변환

배경

 어쩌다보니 플라스크를 이용해서 서버관련된 개발을 하게 되었다. 원래 도쿠 위키에 정리를 해놓은 문서이지만, 다시 블로그에 올리는게 나을 것 같아 정리를 한다.

 서버쪽에서 데이터를 수집 및 표시를 할 때 시간에 대해서 자주 다룬다. 특히 실시간으로 뭔가를 처리해야 할 경우나 데이터를 처리하는 경우 더 더욱 자주 사용한다. 참고로 하드웨어 쪽 펌웨어의 timestamp와 서버에서 말하는 timestamp 간 차이가 있으니 주의해서 이해를 해야 오해가 없다.

 

datetime 관리 팁

 서버에서 timestamp의 의미는 unix timestamp로 1초는 1의 값이 된다.

 

 파이썬에서는 내장모듈인 datetime을 중심으로 코드를 작성하는 것이 좀 더 단순한 구조가 된다. 이는 내장 모듈이기 때문에 어지간하면 ORM 모듈에서 지원을 하기 때문이다.

1. datetime now

from datetime import datetime

datetime.now()
# datetime instance now

 

2. datetime to timestamp

from datetime import datetime

timestamp = datetime.now().timestamp()

 

3. datetime to str

from datetime import datetime

datetimeStr = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%L")
# ex) 2021-06-07 14:57:01.113000

 

4. timestamp to datetime

from datetime import datetime

timestamp = datetime.now().timestamp()
dt = datetime.fromtimestamp(timestamp)

 

5. str to datetime

from datetime import datetime

datetimeStr = "2021-06-07 14:58:01.11100"
dt = datetime.strptime(datetimeStr, "%Y-%m-%d %H:%M:%S.%L")

 

참조 자료

(추후 추가)

반응형
반응형

Multi-Progress 표시하기

작성 계기

이미지 유사도 검색 프로토타입 엔진을 만드는 과정에서 멀티 프로그래스를 사용하게 되었다. 문제는 검색을 하는 데이터가 많기 때문에 프로토타입 종료를 위한 테스트에 사용되는 데이터의 양이 많기 때문에 로드하는 데 생각보다 시간이 많이 걸린다.

문제는 설치 및 시연 시스템을 구축업무를 다른 사람이 어느정도 진행이 되고 있는지를 표시할 화면 필요하다. 그래서 찾던 중 스택오버플러우 형님의 코드를 확인하게 되었다. 문제는 원본 url을 메모를 안해서 잊어 버렸지만;;; 뭐 검색에 시간이 걸렸으니 다른 사람에게라도 도움이 되라고 기록으로 남긴다.

주의 사항

본래 curses 모듈은 유닉스 계열 터미널에서만 지원이 된다. 하지만, windows-curses 모듈을 pip로 설치를 하면, 해결이 된다. 모듈명 등 모든 것이 본래의 curses와 같아서 해당 모듈을 사용한 python 코드는 호환이 된다. 나중에는 내장 모듈로 이관되기를 희망한다.

>pip install windows-curses

예시 코드

import curses
import time

def report_progress(filename, progress):
    """progress: 0-10"""
    stdscr.addstr(0, 0, "Moving file: {0}".format(filename))
    stdscr.addstr(1, 0, "Total progress: [{1:10}] {0}%".format(progress * 10, "#" * progress))
    stdscr.refresh()

if __name__ == "__main__":
    stdscr = curses.initscr()
    curses.noecho()
    curses.cbreak()

    try:
        for i in range(10):
            report_progress("file_{0}.txt".format(i), i+1)
            time.sleep(0.5)
    finally:
        curses.echo()
        curses.nocbreak()
        curses.endwin()

참고 자료

반응형
반응형

임의의 progress status

작성 계기

tqdm 이라는 훌륭한 progress bar 렌더링 툴이 있지만, 구닥다리 환경에서 개발할 때 필요해서 약 10분정도 생각해서 임시로 만든 progress 상태를 표시해줌. 인터페이스는 대략 tqdm과 유사하게 작성을 하였고, 기본 generator 기능을 활용하여 구현하였음.

 

작성하고 보니 역시 프로그래밍 언어 부분의 발전은 개발자의 생산성 향상에 연결된다는 생각이 들었음.

예시

import time

def prog(jobs, desc=None):
    entire = len(jobs)
    progStr = "" if desc is None else desc
    progStr += " : [{} / {}]"
    for itN, itJob in enumerate(jobs):
        print(progStr.format(itN +1, entire), end="\r")
        yield itJob
    print()

if __name__ == "__main__":
    for it in prog(range(30), desc="잉여럭"):
        time.sleep(.5)
반응형

'Python > Python3' 카테고리의 다른 글

[python3]datetime, timestamp, str 변환  (0) 2021.06.07
[python3]Multi-Progress 표시하기  (0) 2019.12.23
[python3]깊은 폴더 생성(재귀호출)  (0) 2019.08.12
[Python3]selenium 모듈 에러 노트  (0) 2019.05.21
[python3]os.path 모듈  (0) 2019.05.04
반응형

깊은 폴더 생성(재귀호출)

작성 계기

은근히 자주 작성해서 기록으로 남김

코드

def checkAndMkdir(pathStr):
    """해당 경로가 없다면 폴더를 생성한다.
    파일이 포함된 경로도 상관 없음
    """
    _, ext = os.path.splitext(pathStr)
    startPath = pathStr if not ext else os.path.dirname(pathStr)
    if not os.path.exists(startPath):
        dirUpperedPath = os.path.dirname(startPath)
        if not os.path.exists(dirUpperedPath):
            checkAndMkdir(dirUpperedPath)
        os.mkdir(startPath)
반응형

'Python > Python3' 카테고리의 다른 글

[python3]Multi-Progress 표시하기  (0) 2019.12.23
[python3]임의의 progress status  (0) 2019.12.23
[Python3]selenium 모듈 에러 노트  (0) 2019.05.21
[python3]os.path 모듈  (0) 2019.05.04
[python3, code style]not의 코드 스타일  (0) 2019.04.30
반응형

OpenCV로 끊김이 적은 동영상 재생

코드

배경이야기가 너무 길어서 두괄식으로 본론인 코드를 먼저 기록한다.

import cv2
import time
import ipywidgets as widgets
import IPython.display as display
import copy

cap = cv2.VideoCapture(video_file)
wImg = widgets.Image(
    layout = widgets.Layout(border="solid")
)
display.display( wImg)

if cap.isOpened():
    ret, img = cap.read()
    while ret:
        # 동영상 파일에서 캡쳐된 이미지를 이미지 파일 스트림으로 다시 인코딩을 한다.
        tmpStream = cv2.imencode(".jpeg", img)[1].tostring()
        wImg.value = tmpStream
        # 20 프레임이 되기 위한 딜레이 다만, 실제로 입력한 것보다 조금 더 딜레이가 있다
        time.sleep(0.05)
        ret, img = cap.read()
cap.release()

배경(도입)

이직을 하고 딥러닝 관련 프로젝트를 하게 되면서 3년만에 IPython notebook을 사용하게 되었다. 지금은 통상 jupyter로 많이 불리기는 하지만, 여전히 IPython notebook의 흔적이 남아 있다. 암튼 jupyter에서는 OpenCV에서 기본적으로 제공하는 imshow()가 정상적으로 작동이 되지 않는다. 이는 초기 OpenCV가 python에서도 동작하게 지원을 할때 독특하게 자체 자료구조인 Mat를 사용하지 않고 numpy.ndarray 자료구조를 사용하게 되면서 IPython Notebook에서 자주 사용하는 matplotlib를 사용하면서 굳이 따로 지원할 필요성을 못 느껴서 그런 것 같다. 게다가 python에 전통적으로 사용하던 IPL 라이브러리 역시 numpy.ndarray구조를 이용하여 이미지 데이터를 관리 하기 때문에 호환도 비교적 쉽다.

OpenCV의 기초인 IO(입출력) 부분에서는 기본적으로 이미지를 화면에 띄우는 것과 동영상을 재생하는 것을 기본적인 과정이다. 이 과정에서 동영상은 여러장의 이미지를 갱신하면서 재생이 된다는 것을 원리로 배울 수 있다. 문제는 matplotlib 의 pyplot 모듈을 이용해서 이미지를 화면에 보여주는데, 이 모듈은 이름에서 볼 수 있듯이 원래는 그래프와 약간이 이미지를 처리하기 위한 모듈이다. 그러다 보니 로컬에서 사용하는 OpenCV에서 처럼 동일한 윈도우에 imshow() 메서드를 호출해서 이미지만 바꿔서 동영상이 재생되는 것을 보여줄 수 없다.

필자는 구글링을 했을 때 스택오버 플로워에서는 다양한 방법들을 제시된 것을 확인 했었는데, 크게 2가지 방법이 있었다. 첫번째 방법은 IPython Notebook에 html 태그 삽입하는 방식을 사용해서 작성하는 방법, 두번째 방법은 webGL 관련 모듈을 설치하여 해당 모듈에 연결하는 방법이다. 필자는 두번째 방법을 시도했었는데, 생각보다. 프래임 드랍이 심했다.

일반적으로 사람이 실시간으로 딜레이를 못느끼는 프래임은 약 20정도인 것을 과거 다른 프로젝트를 통해서 경험을 했었다. 당연히 20프레임 이하였으니 상당한 딜레이를 느꼈던 것이다. 한동안 실망하고 잊고 있었다.

그러던 우연히 ipywidgets 이라는 IPython 자체 지원 모듈중 Image 위젯을 사용해서 이미지를 보는 보조 툴을 만들 일이 있었는데, 생각보다 이미지 파일 전환에 딜레이가 적다는 생각이 들었다. Image 위잿의 파일의 바이너리 스트림을 입력하는 부분에 동영상에서 읽은 이미지를 인코딩을 해서 연속적으로 렌더링을 하게 하면 WebGL보다 부드럽게 이미지 재생이 되지 않을까? 하는 발상으로 테스트를 해보니 생각보다 20프레임 이상 재생이 되는 것을 확인 했었다.

여기서 추가로 테스트 할 점은 코덱을 jpeg 외에 png, bmp 각각 변경해서 시도를 해봤는데, 인코딩시 스트림의 크기 클 수로 느려지는 것을 확인했다. 즉 압축률이 좋을 수록 동영상 재생의 딜레이가 적어지는 것을 알 수 있었다.

반응형
반응형

Python3 selenium 모듈 에러 노트

모듈 개요

일반적으로 웹 크롤링을 할 경우 JS를 활용하기 위해서 많이 사용된다. 관련 서적도 있기는 하다.

배경

약 300만개의 이미지가 프로젝트에서 필요해 간단하게 크롤링을 하면서 발견한 오류이다.

개발 환경

windows 10
python 3.6.8
vs code
chromedriver 74.xx

문제점

증상

살 사용하던 중 webdriver 인스턴스에서 호출되는 것은 문제가 안되는데, 메서드로 호출된 하위 element들이나 element 중에서 find_elements_by_class_name(), find_element_by_xpath(), find_elements_by_xpath() 같은 메서드를 호출하게 되면, 프로그램이 불안정하게 종료가 되어 버리는 현상이 발견되었다.

비정상적인 종료이기 때문에 chromedriver를 headless 옵션으로 실행할 경우 프로그램이 종료가 되어도 계속 프로세스가 유지 되는 현상도 있었다.

원인

execute_script()를 호출한 이후에 해당 증상이 나타난다. 전후 관계를 보았을때 selenium 모듈내의 버그로 생각된다. 에러메시지를 추적을 하면, errorNo 까지 호출은 하지만, 비정상적인 프로그램 종료가 되는 것을 보아 예외처리 부분도 아직 안된 것으로 보인다.

(임시) 해결 방법

오류를 신고를 해야 할 듯한다(귀찮다). execute_script() 실행과정에서 문제가 있고, 그 문제가 나중에 터지는 것으로 판단이 되기 때문에 일단은 webdriver 인스턴스를 refresh()를 호출하여 갱신 시킨후에 문제가 되는 메서드를 호출을 해봤다. 결과는 잘된다.문제는 중간에 이 과정으로 인해서 시간이 더 걸리게 된다.

반응형

+ Recent posts