zsh hook

  • 해당 hook은 py 프로젝트내 "자동화된" 가상환경 세팅 및 배포 환경을 세팅 하다가 관련된 에러로 정리함.

목표

uv로 python 패키지 환경만큼은 통폐합하기로 했다.

  • 현재 python 생태계에서 여러 package manager를 전전 하다가 uv 로 바꿔서 써보고 있는데

    • 개인적인 이유는 일단 심플. 마치 docker --> docker_compose로 넘어간 것 처럼..
  • python로 관리시작.. 이후 pip, pyenv, poetry 등 추천하는거 다 해보다가 cmd 계속 헷갈리기도 하고.. 매번 골치가 아프다 (여기엔 깔려있는데.. 저기엔 안깔려있고.. 내 메모리의 한계..)

  • 또 virtualenv, source.. 이런 거 프로젝트 할때마다 가상환경 올릴때마다 쓰기 싫었다.

  • 호환이 안되는 라이브러리는 매번 다른 도구에 도전해야하는데 (특히 의존성문제로 이것저것 다 시도하는데)

    • 전국 재패... 통폐합 결정!

단점

uv 너마저..

  • 다만 uv로도 호환이 안되는 라이브러리 (특히 ml, dl)가 있었다.
    • 위 에러는 기억나면 다시 써야겠음
  • 이럴때는 불가피하게 pip 호환해서 써야하는데.. 🤮
    • 나름 uv pip 라서 다행인 건가..
      • uv 세팅하다 에러난 오늘것은 기록 추가함
  • 근데 매 프로젝트마다 uv 써서 가상서버 만드는것도 귀찮고
    • 그래서 아예 매 프로젝트 상단에 .venv 설정되면 바로 가상서버로 들어가게 세팅을 시도함

zshrc내 hook 설정

  • 개발 환경 zsh 프로세스 세팅 조건에 따라 다름 주의
  • 기존 추천
    direnv 설치 후 plugins=(git virtualenv)로 변경하라함.
    • 나의 경우 zshrc 내 플러그인, 테마설정, gitPR등 여러가지로 custom 되어있었음. 때문에 hook 추가로 기능을 추가
 50 autoload·-U·add-zsh-hook
 51 
 52 _auto_venv(){
 53 ··local·venv_path=".venv"
 55 ··local·current="$VIRTUAL_ENV"
 56 
 57 ··if·[·-d·"$venv_path"·]·&&·[·-f·"$venv_path/bin/activate"·];·then•
 59 ····if·[·-z·"$current"·]·||·[·"$current"·!=·"$(cd·"$venv_path";·pwd)"·];·then
 60 ······[·-n·"$current"·]·&&·deactivate·>·/dev/null·2>&1·||·true
 61 ······source·"$venv_path/bin/activate"
 62 ····fi
 63 ··else
 65 ····[·-n·"$current"·]·&&·deactivate·>/dev/null·2>&1·||·true
 66 ··fi
 67 }
 68 
 69 add-zsh-hook·chpwd·_auto_venv
 70 _auto_venv·#·터미널·새창에서·1회·실행
  • 위 hook으로 일단 자동 세팅 기능은 완료

Powerlevel10k(p10k)

  • 터미널 환경에서 venv 가 제대로 설정된 상태로 작동하는지 직관적인 디자인이 필요함
    • 이게 처음엔 zshrc 문제인줄 알았는데 알고보니 p10k이라는 것을 써야한단다 (zsh ui/ux 테마 임)
      보아하니 분명 내가 세팅했을텐데

디자인 역사

    1. typeset -g POWERLEVEL9K_VIRTUALENV_CONTENT_EXPANSION='(${VIRTUAL_ENV:h:t})
  • 4(최종).

p10k-err1 : 수동 설정

Status

  • p10k configure을 입력하면 완전 처음 ui/ux , 즉 아이콘부터 처음부터 다시 세팅하라고 나옴
  • Python/virtualenv 표시 옵션 “표시”로 선택 > 이게 필요한데 configure로는 강제적으로 처음부터 다 세팅해야해서 한참 걸릴 것 같음
    - 그래서 수동 설정 진행
    ~/.p10k.zsh에서 virtualenv 세그먼트를 추가/활성화.

DIR

  • ~/.p10k.zsh에서 virtualenv 세그먼트를 추가/활성화.
    • 왼쪽에 표식이 나와야 함으로
typeset -g  
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
      virtualenv
      # ...
      )
    

p10k 기본정책이 virtualenv 표기를 막는다고 함

이유

  • p10k는 흔한 이름(.venv, venv 등)을 지루하다고 보고 숨깁니다: POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES 기본에 포함

  • pyenv/python 세그먼트가 보이면 virtualenv를 겹치지 않게 숨깁니다: POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV 기본이 false/if-different 계열

  • 또, 표기 형식 미설정 시 테마/세그먼트 배치에 따라 체감이 약할 수 있음

    • 때문에 가상환경 강제 표시 /세팅은 OUTSIDE ARRAYS에서 옵션 추가해야함.
typeset -g POWERLEVEL9K_VIRTUALENV_CONTENT_EXPANSION='${VIRTUAL_ENV:t}' ← 표시 내용 강제
typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐️🐍'
typeset -g POWERLEVEL9K_VIRTUALENV_PROMPT_ALWAYS_SHOW=true ← 항상 표시
typeset -g 
POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=true ← pyenv와 함께 표기
typeset -g POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES=() ← 숨김 목록 비우기	

zsh-hook 오타 -err1

_auto_venv:7: _auto_new: function definition file not found
  • 그래서 .zshrc만 고치면 될 줄 알았는데 수정이 되지 않았다.
    이유
  • zsh는 프로세스 메모리에 "함수/훅" 배열이 유지된다고 함.
  • 한 번 add-zsh-hook chpwd _auto_new가 실행된 세션에선 이후 source ~/.zshrc를 반복해도 그 훅이 남아 있습니다.
    • 그래서 이미 잘못된 훅을 이미 실행 시켰어서, fail 이 되었어도 해당 _auto_new는 이미 zsh 메모리에 등록됨.
      • .zshrc는 파일을 다시 읽을 뿐, typo 해결하고 저장해도 기존의 훅을 자동으로 지워주질 못함

zshrc내 띄어쓰기 주의 -err2

_auto_venv:[:13: ']' expected
[ -n "$current"] && deactivate >/dev/null 2>&1 || true
# 올바름: [ -n "$current" ] && deactivate >/dev/null 2>&1 || true
  • 들여쓰기는 모르겠는데, 띄어쓰기(공백)은 누락되면 에러가 잡힌다.

아무리 봐도 안보이는 typo hook - err3

훅 찾기

  • 기존이 zshrc 에 add-zsh-hook 훅 'auto_venv' 등록 후 확인
    grep -nH "_auto_new" ~/.zshrc ~/.zshenv ~/.zprofile ~/.zlogin ~/.oh-my-zsh/custom/**/*(.N)  // 이미 typo 수정 후엔 안나옴.
    add-zsh-hook -L  // “현재 세션 메모리”의 훅 목록입
    zsh -x -c 'source ~/.zshrc' 2>&1 | sed -n "1,120p" // 출력으로 에러 라인 확인.
    functions _auto_venv | sed -n '1,120p' // 함수정의 확인   
    whence -v _auto_new || true   //함수 존재
  • 참고로 나의 경우 _auto_new라는 훅이 안 나왔음.
    • 도대체 어디서 불러오는건지 알 수가 없음

해결 방안

  • 원인 분석 : "과거 세션에서 등록된 메모리 상태”뿐입니다.
    • zsh는 한 번 등록된 훅(혹은 오타 함수명)을 세션에 유지합니다. 삭제 후 재등록/재소싱하면 해결됩니다.
  # 1) 혹시 남아 있을 수 있는 잘못된 훅/함수 제거
    add-zsh-hook -L | grep _auto_new && add-zsh-hook -d chpwd _auto_new // 훅만 지우기
    unfunction _auto_new 2>/dev/null || true // 함수 정의 삭제 
    unalias _auto_new 2>/dev/null || true

    # 2) 올바른 훅만 남겨두기(있다면 지우고 다시 등록해도 됨)
    add-zsh-hook -d chpwd _auto_venv 2>/dev/null || true

    # 3) 함수/훅 재로드
    source ~/.zshrc
  • chpwd : 디렉터리 변경시 실행되는 zsh 훅이름
    • add-zsh-hook chpwd <func>로 등록/삭제합니다.
  • 2> /dev/null/ ||true 은 에러가 있으면 표시 아니면 표기 없이 넘어감.

uvicorn- err

error: Failed to spawn: main:app (No such file or directory)

live 서버는 중요해..

  • Status
    uv run main:app --reload 이렇게 써서 에러남
  • Debuging
    uv는 첫 인자를 “실행 파일”로 보니까 main:app를 바이너리로 찾다가 실패합니다.
  • 즉 uv 가 main.py 를 이해하는게 아니라 main:app 실행파일 찾다가 실패하는 경우임.
    • 나는 실제 배포환경을 보려 Uvicorn 쓰고있으니 이 uvicorn을 명시해줘야하는거임
  • uv run -- <cmd>: -- 뒤는 그대로 하위 명령에 전달.
    • 참고로 uv run 이 uv sync, uv venv 둘 다 자동 실행하는 명령어임.
      Docs
  • fastapi 서버로 개발중이라서 만약 fastapi실행시 DX > 디버깅용으로 쓰면 좋다고 함
# hot reload
 uv run uvicorn main:app --reload
 uv run fastapi dev main.py: 

uv 쓰기 다짐하신 개발자

References- UV Docs

profile
🏠TECH & GOSSIP

0개의 댓글