반응형

pyenv는 한 컴퓨터 안에서 여러 Python 버전을 설치하고, 프로젝트나 터미널 세션별로 사용할 버전을 바꾸게 해주는 버전 관리자입니다.

macOS에서 Homebrew Python 패키지만으로 원하는 과거 버전을 맞추기 어려울 때는 pyenv install, global, local, shell의 역할을 구분해두면 Python 버전 충돌을 줄일 수 있습니다.

 

핵심 정리

pyenv는 Python 패키지 의존성 관리 도구가 아니라 Python 실행 파일 버전을 고르는 도구입니다. 먼저 필요한 Python 버전을 설치하고, 전체 기본값은 global, 특정 프로젝트 디렉터리는 local, 현재 터미널 세션의 임시 전환은 shell로 지정합니다. 가상환경은 별도 virtualenv나 pyenv-virtualenv가 맡는 영역이므로, Python 버전 선택과 패키지 격리를 분리해서 이해하는 편이 좋습니다. 초기화 스크립트와 설치 방식은 셸과 pyenv 버전에 따라 달라질 수 있어 실제 설치 전에는 공식 pyenv README를 확인해야 합니다.

  • pyenv install은 사용할 Python 버전을 새로 설치하는 단계입니다.
  • pyenv versions는 설치된 버전 목록과 현재 선택된 버전을 확인할 때 씁니다.
  • pyenv global은 기본 Python 버전을 전역으로 지정합니다.
  • pyenv local은 현재 프로젝트 디렉터리에만 적용되는 Python 버전을 지정합니다.
  • pyenv shell은 현재 터미널 세션에서만 임시로 Python 버전을 바꿉니다.
  • activate 명령은 가상환경 활성화에 가깝고, pyenv의 핵심 역할은 어떤 Python 실행 파일을 쓸지 고르는 것입니다.

원문은 과거 Python 버전 사용 문제에서 출발한 글입니다. 이번 보강은 명령어를 무작정 따라 치기보다 global, local, shell의 차이를 먼저 보이게 바꾸고, 설치 명령은 공식 README 확인이 필요하다는 안전 장치를 넣었습니다.

이어서 볼 글

 

mac에서 brew install python@3.6 등의 명령으로 여러버전의 python을 설치할 수 있으나, 과거 버전은 지원하지 않는다.

이때 pyenv를 통해서 여러버전의 python을 동시에 운용할 수 있다.

먼저 brew install pyenv를 통해서 pyenv를 설치한다음

pyenv install 3.6 등의 명령어를 통해 필요한 버전을 설치하면 된다.

해당 버전으로 전환하기 위해서는 먼저 .zshrc또는 .bashrc파일에 다음 내용을 추가해야한다.

(참고로 macOS의 경우 요즘엔 zsh이 기본이다)

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

그다음 source ~/.zshrc 또는 source ~/.bashrc로 적용하고

 

pyenv global 3.6 등의 명령어를 통해 버전을 전환하면 된다.

global은 시스템 전체에서 기본적으로 사용할 Python 버전을 설정하라는 명령어이다.

local을 대신 쓰면  그 프로젝트의 디렉터리 내에서만 사용할 Python 버전을 따로 설정할 수 있다.

pyenv versions 를 통해서 현재 시스템에 설치된 버전들을 볼 수도 있다.

pyenv global system을 하면 원래 시스템의 python으로 돌아갈 수도 있다.

 

virtualenv와의 관계

pyenv
역할: pyenv는 여러 버전의 Python을 설치하고 관리하는 데 사용됩니다. pyenv를 사용하면 시스템 전체에 걸쳐 여러 Python 버전을 설치하고, 각각을 필요에 따라 선택하여 사용할 수 있습니다. 이를 통해 서로 다른 프로젝트에서 다른 Python 버전을 쉽게 사용할 수 있습니다.

activate 명령어: pyenv는 환경을 활성화하기 위해 activate 명령어를 직접 사용하지 않습니다. 대신, pyenv local, pyenv global, pyenv shell 같은 명령어를 통해 Python 버전을 설정합니다. 이러한 설정을 통해 특정 디렉터리나 세션에서 사용할 Python 버전을 자동으로 활성화하게 됩니다.

많은 사용자들은 pyenv 를 사용하여 여러 Python 버전을 관리하고,
virtualenv (또는 pyenv 의 플러그인인 pyenv-virtualenv )를 사용하여 특정 버전에 대한 독립적인 개발 환경을 생성합니다. 이렇게 하면 Python 버전 관리와 프로젝트 의존성 관리를 모두 효과적으로 할 수 있습니다.

 

반응형
반응형

Python venv는 프로젝트마다 패키지 설치 공간을 분리해 버전 충돌을 줄이는 표준 가상환경 도구다.

venv와 virtualenv의 차이는 표준 라이브러리 포함 여부와 오래된 Python 지원 범위에 있으며, 실제 사용에서는 가상환경 생성, 활성화, 패키지 설치, requirements 저장 흐름이 중요하다.

 

핵심 정리

venv는 Python 3에 포함된 표준 가상환경 도구이고 virtualenv는 별도로 설치해 더 넓은 호환성과 기능을 제공하는 도구다. 둘 다 프로젝트별 패키지 공간을 분리한다는 목적은 같으며, requirements.txt와 함께 쓰면 다른 환경에서도 같은 패키지 구성을 재현하기 쉽다.

  • venv는 Python 3.3 이후 표준 라이브러리에 포함된 가상환경 도구다.
  • virtualenv는 별도 설치가 필요하지만 오래된 Python 버전과 추가 기능을 지원한다.
  • 가상환경을 활성화한 뒤 pip install을 실행하면 해당 환경 안에 패키지가 설치된다.
  • requirements.txt는 현재 환경의 패키지 목록을 저장하고 다시 설치하는 데 사용한다.
  • pyenv는 Python 실행 파일 버전을 고르는 도구이고 venv는 패키지 환경을 분리하는 도구다.

Python 프로젝트를 시작할 때는 먼저 사용할 Python 버전을 정하고, 그 다음 가상환경을 만든 뒤 필요한 패키지만 설치하는 흐름이 가장 깔끔하다.

이어서 볼 글

 

 

venv는 virtualenv와 비슷하며 특징을 정리하면 다음과 같음

 

venv

  • venv는 python개발진에 의해 개발되었으며, python3.3부터 등장과 동시에 표준라이브러리로 공식 지원됨.
  • 공식 지원되므로 별도의 설치과정이 필요 없음

 

virtualenv

  • virtualenv는 python 2버전 시절 부터 널리 사용되었으며, 따라서 지금도 python2버전을 지원함
  • virtualenv가 표준으로 채택되지 않은 이유는 더 간단하고 일관된 환경을 만들기 위한 판단이었던것으로 보임
  • virtualenv는 venv보다 더 많은 기능을 제공. 예를 들어, 특정 버전의 Python을 지정하여 가상 환경을 생성할 수 있음
  •  Python 표준 라이브러리에 포함되어 있지 않기 때문에 별도로 설치해야 함
반응형
반응형

mypy와 pytype은 모두 Python 코드를 실행하지 않고 타입 문제를 찾는 정적 분석 도구이지만, 타입 힌트에 기대는 방식과 타입 추론 방식에서 차이가 있습니다.

원문은 TypeScript와 비슷하게 Python에서 타입 오류를 미리 찾는 도구로 mypy와 pytype을 비교하고, annotation이 있는 예제와 없는 예제를 함께 보여줍니다.

 

핵심 정리

mypy는 Python type hint를 기반으로 함수 인자, 변수, 반환값이 맞는지 검사하는 정적 타입 체커입니다. pytype도 정적 분석 도구이지만, 타입 annotation이 적은 코드에서도 추론을 통해 가능한 타입 오류를 찾는 데 초점을 둡니다. 원문 예제처럼 age를 int로 선언하고 문자열을 넣으면 mypy가 잡아낼 수 있고, annotation이 없는 곱셈 예제에서는 pytype이 int와 str 연산 문제를 추론해낼 수 있습니다.

  • mypy는 PEP 484 스타일 type hint를 기반으로 Python 코드를 검사합니다.
  • pytype은 annotation이 적은 코드에서도 타입 추론을 사용해 오류 후보를 찾습니다.
  • 둘 다 코드를 실행하지 않고 분석하므로 런타임 테스트를 대체하지는 않습니다.
  • mypy는 명시적 annotation을 늘려가며 점진적으로 도입하기 좋습니다.
  • pytype은 기존 코드에서 annotation이 부족한 부분을 추론해보는 데 도움이 됩니다.
  • 실무에서는 팀의 코드 스타일, CI 속도, 오류 엄격도에 맞춰 하나를 선택하거나 병행할 수 있습니다.

원문은 mypy 설치와 실행, pytype 예제, 두 도구의 차이를 TypeScript와 비교해 설명했습니다. 보강 블록은 mypy와 pytype이 각각 무엇을 잘 잡는지 먼저 보이게 정리했습니다.

Mypy

Mypy는 Python 코드에 대해 정적 타입 검사를 수행하는 도구입니다.

이는 TypeScript의 컴파일러와 유사한 역할을 수행하며, 코드에서 타입 오류를 찾아내는 데 도움이 됩니다​.

예제:
먼저 mypy를 설치합니다:

pip install mypy


다음은 mypy를 사용한 Python 코드 예제입니다:(name에 대해 str이라는 어노테이션을 했음에 주목. python 3.5기능)

# 파일명: example.py

def greeting(name: str) -> str:
    return "Hello, " + name

age: int = "25"  # 이 줄은 타입 오류를 발생시킵니다.

print(greeting("Alice"))


터미널에서 mypy를 사용하여 코드를 검사합니다:

mypy example.py

이 명령을 실행하면, mypy는 age: int = "25"라인에서 타입 오류를 발견하고 이를 알려줍니다.


Pytype:

Pytype은 또 다른 Python 정적 타입 검사 도구.

어노테이션이 없어도 추론을 기반으로 동작함.

예를들어 아래와 같이 어노테이션이 없는 코드에 대해서 pytype을 수행하면

def multiply_numbers(a, b):
    return a * b

result = multiply_numbers(5, '3')
print(result)

아래처럼 런타임전 경고를 확인할 수 있음(런타임에서는  Python은 문자열 '3'을 5번 반복하여 '33333'을 생성하고 오류로 판단하지 않음)

$ pytype example.py
Computing dependencies
Analyzing 1 sources with 0 local dependencies
ninja: Entering directory `/Users/user/.pytype'
[1/1] check example
FAILED: /Users/user/.pytype/pyi/example.pyi 
pytype-single --imports_info /Users/user/.pytype/imports/example.imports --module-name example -V 3.8 -o /Users/user/.pytype/pyi/example.pyi --analyze-annotated --nofail --quick /Users/user/example.py
File "/Users/user/example.py", line 4, in <module>: unsupported operand type(s) for *: 'int' and 'str' [unsupported-operands]
  Function multiply_numbers was called with the wrong arguments (1:15)

For more details, see https://google.github.io/pytype/errors.html#unsupported-operands.
ninja: build stopped: subcommand failed.

Mypy vs Pytype

Mypy

Mypy는 Dropbox에서 개발되었으며, Python의 첫 번째 정적 타입 검사 시스템으로 간주됩니다.

이 도구는 2012년부터 개발이 시작되었으며, 아직도 활발하게 개발이 진행되고 있습니다​.
Mypy는 standalone으로 실행되거나, 커맨드 라인이나 편집기 또는 IDE의 linter 통합의 일부로 작동할 수 있습니다.
Mypy는 타입 어노테이션을 포함하지 않은 코드에 대해 대부분의 코드 검사를 수행하지 않으며, 이는 점진적으로 코드 기반을 주석 처리하고 있는 경우 Mypy가 시간을 낭비하지 않도록 하기 위함입니다.


Pytype

Pytype는 Google에서 개발되었으며, Mypy와 달리 타입 설명자 대신 추론을 사용합니다. 즉, Pytype는 코드 흐름을 분석하여 타입을 결정하려고 시도하며, 타입 어노테이션에 엄격하게 의존하지 않습니다​1.
Pytype는 가능한 한 관대하게 행동하며, 런타임에서 작동하고 어떤 어노테이션도 모순되지 않는 연산이 있으면 Pytype는 그것에 대해 불평하지 않습니다.
pytype의 reveal_type(expr)을 사용해서 런타임 전에 type()과 비슷한 기능을 활용하여 디버깅/개발 가능

반응형
반응형

Python 로그에서 한글이 유니코드 escape나 바이트 escape 형태로 보이면, 문자열이 어떤 인코딩 단계를 거쳤는지에 따라 복원 방법이 달라집니다.

u로 시작하는 유니코드 escape는 Python이 문자로 해석할 수 있고, 백슬래시 숫자 형태의 바이트 시퀀스는 latin1로 되돌린 뒤 UTF-8로 디코딩해야 할 때가 있습니다.

 

핵심 정리

로그에 u 형식의 escape 문자열이 보이면 Python에서 그대로 출력해 실제 한글을 확인할 수 있습니다. 반대로 여러 바이트가 백슬래시 숫자 형태로 보이면, 원래 UTF-8 바이트가 잘못 문자열화된 경우일 수 있습니다. 이때는 먼저 바이트 값으로 되돌린 뒤 올바른 인코딩으로 decode해야 합니다. 핵심은 현재 값이 문자 문자열인지, 바이트를 문자처럼 표시한 것인지 구분하는 것입니다.

  • 유니코드 escape는 코드 포인트가 문자로 표시되지 않고 escape 형태로 보이는 경우입니다.
  • u 문자열을 출력하면 Python이 escape를 실제 문자로 해석할 수 있습니다.
  • 백슬래시 숫자 시퀀스는 원래 바이트가 문자열처럼 보이는 경우일 수 있습니다.
  • 잘못 문자열화된 UTF-8 바이트는 latin1로 encode한 뒤 UTF-8로 decode해 복원할 수 있습니다.
  • euc-kr과 UTF-8은 서로 다른 인코딩이므로 변환 방향을 잘못 잡으면 글자가 깨집니다.
  • 로그 원본이 bytes인지 str인지 먼저 확인해야 해결 방법이 좁혀집니다.

한글 인코딩 문제는 정답 코드 하나보다 현재 문자열의 정체를 파악하는 일이 먼저입니다. escape가 코드 포인트인지, UTF-8 바이트인지, euc-kr 바이트인지 구분하면 복원 방향을 더 안전하게 정할 수 있습니다.

로그중에 u'\ucc98\ub9ac' 이런식의 시퀀스가 보이면, 그냥 긁어서 다음과 같이하면 보인다

>>print(u'\ucc98\ub9ac')

처리

 

hex와 euc-kr/utf-8 변환에는 다음 사이트가 좋다.

https://r12a.github.io/app-encodings/

 

Encoding converter

show all the characters in: Select... big5 euc-jp iso-2022-jp shift_jis euc-kr gb18030 (index only) gbk koi8-r koi8-u windows-1250 windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 windows-1256 windows-1257 windows-1258 macintosh ibm866 wind

r12a.github.io

 

로그중에 "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234" 이런형식의 시퀀스가 보이면 다음처럼 해보면 된다.
>>> a = "\353\224\224\354\226\264\353\270\214\353\240\210\353\223\234"
>>> print(a.encode('latin1').decode('utf-8'))
디어브레드
 
 
반응형
반응형

 

핵심 정리

이 글은 Python 기본 GUI 도구인 Tkinter로 간단한 데스크톱 화면을 만들며 기록한 실습 메모입니다. 원격 Linux 환경에서 X server로 화면을 띄우는 과정, 라디오 버튼 초기값, grid 기반 위젯 배치와 정렬 문제를 중심으로 정리합니다.

  • Tkinter는 Python에 기본 포함된 GUI 모듈이라 별도 프레임워크 없이 화면을 만들기 쉽습니다.
  • SSH로 접속한 Linux 환경에서 GUI를 표시하려면 X server 전달 환경을 확인해야 합니다.
  • 라디오 버튼처럼 값이 있는 위젯은 초기값 설정 방법을 별도로 확인해야 합니다.
  • 레이아웃은 grid, pack, place 중 한 방식을 일관되게 사용하는 편이 관리하기 쉽습니다.
  • grid 배치에서는 columnspan, Frame, sticky 설정이 화면 정렬에 영향을 줍니다.

본문은 실제 원격 접속 환경과 위젯 배치에서 막혔던 점을 기록하고 있으므로, Tkinter를 처음 실행하거나 화면 정렬을 조정할 때 참고하기 좋습니다.

개인적으로 python으로 GUI프로그램을 하나 작성할일이 생겨서, 여기에 그 과정을 기록해본다.

여기를 참고해서 파이선에 기본적으로 딸려 나온다는 Tkinter를 사용해보기로 결정했다.

처음 tutorial은 여기를 참고했는데, 기본적으로 딸려 나오는 모듈이라그런지 사용도 무척 쉬웠다.

만약 리눅스에 ssh로 접속하고 있다면 x-server를 사용해야하는데,

나의 경우 라즈베리파이에 깔린 라즈비안에 윈도우에서 MobaXTerm으로 접속하는데, 메뉴에서 Start X-Server만 해주면 바로 동작했다.

(집과 회사등 여러군데에서 ssh로 접속하는 경우는 실행할때 충돌나면서 안되는 경우가 있었는데, 이때는 여기참조해서 터미널(?) 하나를 죽여주면 잘 동작함을 확인)

한글로 레이블을 만들면 텍스트가 깨져보이는데, 이게 생각보다 고치기 쉽지 않네 ㅠ 검색도 잘 안되고.. 일단 그냥 영어버전으로 만들기로 하고(...) 넘어감

String으로 된 radiobutton 컨트롤의 경우 위링크에서 추가적으로 여기를 참조해야 초기값 세팅이 가능했다.

위젯간 align을 위해서 grid()를 사용하거나 pack()을 사용하거나 place()를 사용하는거 같은데, 나는 단순하게 하기 위해서 grid()를 사용했다(위의 tutorial에서 소개한 방법이기도 하고).. 섞어 쓰기 보다는 하나만 선택해서 써야하는 것 같은 인상을 받았다.

그런데 grid()의 경우 columnspan을 사용하거나, Frame()으로 그룹핑해주지 않으면 가상의 테이블 때문에 내가 원하는대로 배치가 되지 않는 현상이 있었다. 위짓간 align을 위해서는 sticky라는 키워드를 사용해야했는데, 좀 거지 같은 설계인것 같다.

반응형
반응형

requirements.txt는 Python 프로젝트에서 필요한 패키지와 버전을 다른 환경에서도 재현하기 위해 기록하는 파일입니다.

가상환경을 기준으로 설치된 패키지를 저장하고, 새 환경에서는 그 목록을 읽어 같은 의존성을 설치하는 흐름으로 사용합니다.

 

핵심 정리

Python 환경은 인터프리터 버전과 설치된 패키지 버전의 조합입니다. 프로젝트를 옮기거나 배포할 때 requirements.txt가 있으면 어떤 패키지를 설치해야 하는지 명확해집니다. 현재 가상환경의 패키지를 파일로 저장할 때는 pip freeze를 사용하고, 파일에 적힌 패키지를 설치할 때는 pip install -r requirements.txt를 사용합니다.

  • 가상환경을 활성화한 뒤 필요한 패키지를 설치합니다.
  • pip freeze는 현재 환경에 설치된 패키지와 버전을 출력합니다.
  • pip freeze > requirements.txt는 패키지 목록을 파일로 저장합니다.
  • pip install -r requirements.txt는 파일에 적힌 패키지를 한 번에 설치합니다.
  • 새 프로젝트에서는 비어 있는 가상환경에서 필요한 패키지만 설치한 뒤 목록을 만드는 편이 좋습니다.
  • requirements.txt는 실행 환경을 완전히 설명하지는 않으므로 Python 버전도 따로 기록해 두는 것이 안전합니다.

requirements.txt를 만들 때 전역 Python 환경에서 바로 freeze하면 불필요한 패키지가 많이 섞일 수 있습니다. 프로젝트별 가상환경을 먼저 만들고, 그 안에서 필요한 패키지만 설치한 뒤 목록을 저장하는 흐름이 가장 깔끔합니다.

이어서 볼 글

 

 

virtualenv 관련해서는여기 참조

파이선환경

The ecosystem consisting of your particular installed version of python

plus all the third-party packages (“libraries”) it can access (and their precise versions)

 

requirements.txt

필요한 이유: 배포하고 나서 필요한 package들을 명시하기 위함

 

 

프로젝트 만드는 입장에서 requirements.txt 생성하기

$ pip freeze 하면 가상환경에서 현재까지 pip install된 라이브러리 목록이 버전과 함께 나열된다.

 

$ pip freeze > requirements.txt 하면 requirements.txt가 생성된다.

가상환경을 사용한 경우 이게 첨에는 아무것도 없을 수 있다.

여기에 뭔가 설치하고 나서(예를 들면 pip install numpy) 다시 해보면 나타나게 된다.

라이브러라(타 프로젝트) 사용하는 입장에서 필요한 모듈(필요한 버전으로) 설치하기

requirements.txt가 있는 경우 pip install -r requirements.txt를 통해 필요 모듈 설치

없는 경우 pip install numpy와 같은 방법으로 하나씩 설치(numpy module을 설치하고 싶다고 했을 때)

이때 설치되는 모듈들은 해당 virtual environment 안에서만 깔린다.

반응형
반응형

Google Colab은 브라우저에서 Python 노트북을 실행하면서 파일 업로드, 다운로드, GitHub 데이터 접근을 함께 처리할 수 있는 환경이다.

Colab에서 파일을 다룰 때는 런타임의 임시 저장소, Google Drive 마운트, GitHub 원본 URL, 로컬 다운로드 방식이 서로 다르다는 점을 먼저 구분해야 한다.

 

핵심 정리

Colab 파일 작업은 현재 런타임 안에 있는 파일, Google Drive에 연결한 파일, GitHub에서 내려받은 파일을 구분하는 것이 핵심이다. 런타임이 초기화되면 로컬 작업 파일은 사라질 수 있으므로 필요한 결과물은 다운로드하거나 Drive에 저장해야 한다.

  • Colab 런타임의 작업 디렉터리는 임시 공간이라 세션이 끝나면 사라질 수 있다.
  • files.download는 생성한 결과 파일을 로컬 PC로 받을 때 사용한다.
  • Google Drive를 마운트하면 노트북에서 Drive 파일을 경로로 접근할 수 있다.
  • GitHub 파일은 raw URL이나 저장소 clone 방식으로 가져올 수 있다.
  • 데이터 경로가 바뀌면 노트북 실행 위치와 현재 작업 디렉터리를 먼저 확인해야 한다.

Colab에서 파일 문제가 생기면 다운로드 명령보다 먼저 그 파일이 런타임, Drive, GitHub 중 어디에 있는지 확인하는 편이 안전하다.

Google colab은 Jupyter ipython notebook과 같은 python code를 온라인에서 공유하면서 작성할 수 있게 해준다.

더구나 GPU도 쓸 수 있고 속도도 빠른편이며 sklearn, prophet등 ML관련 library들도 대부분 미리 설치되어 있다.

팁1: 인터넷에 있는 파일을 바로 다운받아서 데이터로 쓰기

ML을 하다보면 데이터가 생명인데, 매번 클릭해서 다운받으면 번거롭기 때문에 wget으로 바로 받으면 공유하기도 좋고 편하다.

공개적으로 올려진 파일의 경우 다음처럼 wget으로 쉽게 받을 수 있다. 

위 파일처럼 압축된 경우에도 다음처럼 zipfile 을 import하여 풀 수 있다.

팁2: github에 있는 파일 받기

github에 올려져 있는 파일의 경우 git clone을 하지 않고 wget만으로는 받기 힘든데.. 다음처럼 raw.으로 시작하는 주소로 바꾸고 약간만 조심하면 바로 받을 수 있다.

주소를 바꾸는 규칙에 대해서는 여기를 참조하라.

요즘에는 그냥 git clone 되는거 같다.

반응형
반응형

 

핵심 정리

Python list와 array 인덱싱은 특정 원소를 고르고, slicing은 연속된 부분 구간을 새로 가져오는 문법입니다. 음수 인덱스와 step을 함께 이해하면 문자열, 리스트, NumPy 배열을 다룰 때 기본기가 잡힙니다.

  • 기본 인덱싱은 0부터 시작하며 음수 인덱스는 뒤에서부터 접근합니다.
  • start와 stop을 쓰는 slicing은 stop 위치를 포함하지 않습니다.
  • step을 추가하면 일정 간격으로 원소를 건너뛰며 가져올 수 있습니다.
  • list slicing은 원본 일부를 새 객체로 만들 수 있으므로 큰 데이터에서는 비용도 고려해야 합니다.
  • NumPy array에서는 같은 인덱싱 감각 위에 조건 선택과 다차원 슬라이싱이 확장됩니다.

Python 배열 문법은 작은 예제로 직접 확인하는 편이 가장 빠릅니다. 특히 stop 미포함 규칙과 음수 인덱스, step 방향만 익히면 입력 파싱과 데이터 전처리 코드도 훨씬 읽기 쉬워집니다.

이어서 볼 글

 

1차원 array

indexing

a = ['a','b','c','d','e','f'] 이런 배열이 있을때, 기본 인덱싱은

a[0] 이렇게 한다 (a[0]은 0번째 element를 indexing하며 따라서 'a'가 된다.)

이때 a[-1] 이렇게 음수도 쓸 수 있으며 마지막 element부터 -1, -2로 indexing된다. (따라서 a[-1]은 'f'가 된다)

slicing

부분집합을 가져오는 slicing은 colon을 한 번 쓰거나, 두 번 쓸 수 있으며,

각각 [start:stop], [start:stop:step] 이라는 의미가 된다.

또한 colon기호는 대괄호 안에서만 쓸 수 있으나 slice() 객체를 사용하면 밖에서 할 수도 있다.

예를 들어 a[1:3] 하면 ['b', 'c']가 되는데, 

a[1:3]은 a[slice(1,3)]과 같기 때문에 

아래처럼 두줄에 나눠쓰는게 가능하다.

> col = slice(1,3)

> a[col]

slicing의 다양한 옵션은 여기를 보면 쉽게 파악할 수 있다.

2차원 array

indexing

a = [[1,2,3],[4,5,6]] 이런 배열이 있을때, 기본 인덱싱은

a[0][1] 이렇게 한다 (a[0][1]은 0번째 row, 1번째 column을 의미하며 값은 2가 된다)

근데 2차원 인덱싱의 경우는 a[0][1]대신 a[0,1]로도 할 수 있다.

slicing

다른건 쉬운데 index을 위한 comma와 slicing을 위한 colon이 같이 쓰이면 헷갈릴 수 있다.

예를 들어 위의 a배열에 대해서 a[:,0:2]라고 하면 [[1,2],[4,5]]가 되는데..

a[:,0:2]는 

a[slice(None, None, None), slice(0, 2, None)]과 같고, 3줄로 풀어쓰면 다음과 같다.

> row = slice(None, None, None)  # 모든 row를 원한다.

> col = slice(0, 2, None)  # 첫번째, 두번째 컬럼만 원한다(마지막 컬럼 배제)

> a[row,col]

반응형
반응형

PuDB는 터미널 환경에서 Python 코드를 한 줄씩 멈춰 보며 변수, 호출 스택, 실행 위치를 확인할 수 있는 디버거입니다.

IDE를 쓰기 어려운 서버 환경이나 터미널 중심 개발 환경에서 print 디버깅보다 더 차분하게 상태를 확인할 때 유용합니다.

 

핵심 정리

PuDB는 Python 코드를 실행하다가 원하는 지점에서 멈추고, 현재 변수 값과 호출 스택을 보면서 문제 원인을 찾는 도구입니다. print를 여러 곳에 넣었다 지우는 방식보다 실행 흐름을 직접 따라가기에 좋고, 원격 서버처럼 GUI IDE를 열기 어려운 환경에서도 터미널 안에서 디버깅할 수 있습니다. 다만 multiprocess 코드에서는 자식 프로세스로 분기되는 순간 디버거가 기대처럼 붙지 않을 수 있으므로, 분기 지점을 잠시 단순화하거나 remote debugging 방식을 따로 검토해야 합니다.

  • PuDB는 Python용 터미널 기반 디버거입니다.
  • 중단점에서 실행을 멈추고 변수와 스택을 함께 확인할 수 있습니다.
  • 한 줄씩 실행하면서 어느 지점에서 값이 달라지는지 추적하기 좋습니다.
  • 원격 서버나 SSH 환경처럼 IDE 사용이 불편한 상황에서 특히 유용합니다.
  • multiprocess 코드는 일반 실행 흐름과 달라 디버깅 방식이 별도로 필요할 수 있습니다.
  • 복잡한 상태를 확인해야 할 때는 print 디버깅보다 재현 위치에서 멈춰 보는 편이 낫습니다.

기존 보강 블록에는 템플릿처럼 보이는 문구가 남아 있었습니다. 이번 수정은 PuDB를 언제 쓰면 좋은지와 multiprocess에서 조심할 점을 본문 맥락에 맞게 다시 정리했습니다.

multiprocess환경에서 디버깅하기

multiprocess를 사용한 경우 pudb가 정상 동작하지 않는다.

 

이럴 때는 multiprocess로 분기하는  부분을 일시적으로 분기하지 않도록 하거나(근데 이 방법은 코딩을 해야하는 불편이 존재)

 

remote debugging을 하는 방법이 있는것 같다.

 

나도 아직 해보진 않았는데.. 여기참조해서 나중에 해보자

반응형
반응형

Anaconda는 Python 데이터 분석 환경을 한 번에 구성하기 위한 배포판이고, Jupyter Notebook은 코드를 셀 단위로 실행하며 실험하기 좋은 도구입니다.

이 글은 Ubuntu와 Mac에서 Anaconda를 설치하고, Jupyter에서 TensorFlow, ipdb, gym 같은 패키지를 추가하던 설정 메모입니다.

 

핵심 정리

Anaconda를 설치하면 conda 환경 관리와 Jupyter Notebook을 함께 사용할 수 있습니다. 설치 후 터미널에서 conda 명령이 인식되는지 확인하고, 필요한 패키지는 conda install로 추가합니다. 패키지가 기본 채널에서 설치되지 않으면 conda-forge 같은 채널을 지정해야 할 수 있습니다. Jupyter에서 디버깅이 필요하면 ipdb를 추가로 설치해 셀 안에서 중단점을 잡을 수 있습니다.

  • Anaconda는 Python과 주요 과학계산 패키지를 묶어 설치하는 배포판입니다.
  • Jupyter Notebook은 코드 실행 결과를 셀 단위로 확인하기 좋습니다.
  • 설치 후 conda 명령이 동작하면 기본 환경 설정이 된 것입니다.
  • TensorFlow 같은 패키지는 conda 환경 안에 설치해야 Notebook에서도 인식됩니다.
  • ipdb는 Jupyter나 Python 코드에서 라인 단위 디버깅을 할 때 사용할 수 있습니다.
  • 기본 채널에서 패키지가 없으면 conda-forge 같은 채널을 지정할 수 있습니다.

이 글은 최신 설치 가이드라기보다 당시 환경 구성에서 막혔던 지점을 정리한 메모입니다. 지금 따라 할 때는 Anaconda 공식 설치 페이지와 패키지별 현재 지원 버전을 함께 확인하는 편이 좋습니다.

 

Anaconda install

Jupyter를 사용하기위해 anacoda install을 진행했다. (linux, ubuntu 환경)

인스톨은 여기를 참조했다.

인스톨후 conda를 입력해서 인식되면 제대로 설치된 것

 

맥환경에서 install 하는건 여기에서 설치프로그램 클릭해서 설치했다.

Jupyter 설정

Jupyter 설치는 conda설치시에 기본적으로 되고, 설정하는 방법은 여기 참조

Jupyter notebook에서 tensorflow를 사용하려면, linux 터미널에서 conda install tensorflow 하면 설치된다.

 

ipdb관련

Jupyter notebook에서 라인디버깅을 하기위해서 ipdb를 추가 인스톨해야했는데 conda install ipdb로는 안됐고

conda install -c conda-forge ipdb로 하니까 깔렸다.

디버깅 방법은 아래와 같다.

 
 

위에거 빠져나올때는 exit() 쳐줘야 한다.

 

gym관련

$ conda install gym으로는 설치가 안됐고

여기 참조해서 $conda install -c akode gym하니까 설치가 됐다.

반응형

+ Recent posts