자꾸 File "/home/container/app.py", line 467 await i.response.send_message 이렇게 뜰 때 (수동 주식 코드 수정)

2026년 4월 19일·12개 메시지

이 글에서는 디스코드 봇에서 IndentationError: unexpected indent가 발생하는 원인과 이를 해결하기 위한 구체적 수정을 정리한다. 호스팅 환경(예: 디스호스트)의 컨테이너에서 실행 중인 app.py에서 발생한 에러를 기준으로, 코드 문법·들여쓰기·변수 선언 문제를 바로잡는 방법을 설명한다.

증상

  • 실행 시 콘솔에 다음과 같은 에러 출력:
    • File "/home/container/app.py", line 467 / IndentationError: unexpected indent
  • 문제가 발생한 줄은 await i.response.send_message(...) 부분
  • 함수 내부의 여러 조건문에서 문법적으로 잘못된 구문이나 들여쓰기 불일치 존재

원인

  • if 조건식 뒤에 잘못된 문자 또는 숫자가 붙어있음: 예: if i.user.id != OWNER_ID:1301678305229144227 — 콜론 뒤에 숫자가 붙어 파이썬이 문법 오류로 처리
  • 딕셔너리 정의를 if 조건문 안에서 잘못 사용함: if 이름 not in STOCKS = { ... }= 할당을 조건식 안에 사용함
  • 들여쓰기(인덴트) 혹은 탭/스페이스 혼용으로 인해 await 같은 블록 내부 문장이 예상치 못한 위치에 있어 IndentationError 발생
  • STOCK_HISTORY 같은 보조 자료구조가 미리 초기화되어 있지 않으면 실행 중 KeyError가 발생할 수 있음

해결 방법

1단계: 문법 및 변수 선언 정리

  • 상단에 상수와 자료구조를 명확히 정의한다. 예:
OWNER_ID = 1301678305229144227
STOCKS = {
    "우이이": 1000,
    "uzi": 1200,
    "noda": 900
}
# 주식 히스토리 초기화 (필요에 따라 defaultdict 사용)
from collections import defaultdict
STOCK_HISTORY = defaultdict(list)
for name in STOCKS:
    STOCK_HISTORY[name]  # 기본 리스트 확보
  • if 문에서 비교/멤버십 연산을 올바르게 쓴다:

    • 잘못: if i.user.id != OWNER_ID:1301678305229144227
    • 올바름: if i.user.id != OWNER_ID:
  • 멤버십 체크는 in/not in을 사용하고, 할당 연산(=)을 조건 내부에 넣지 않는다:

    • 잘못: if 이름 not in STOCKS = { ... }
    • 올바름: if 이름 not in STOCKS:

2단계: 들여쓰기와 비동기 흐름 확인

  • 파이썬은 들여쓰기에 민감하다. 에디터에서 탭과 스페이스를 혼용하면 IndentationError가 발생하기 쉬우므로 프로젝트 전체에서 스페이스(권장 4칸)로 통일한다.
  • 블록 내부의 모든 문장은 동일 수준의 들여쓰기를 유지해야 한다.
  • 최종적으로 비동기 함수는 다음처럼 정리한다:
@tree.command(name="주식변동")
async def 주식변동(i: discord.Interaction, 이름: str, 값: int):
    if i.user.id != OWNER_ID:
        await i.response.send_message("❌ 개발자만 가능", ephemeral=True)
        return

    if 이름 not in STOCKS:
        await i.response.send_message("❌ 없는 주식", ephemeral=True)
        return

    if 값 < 0 or 값 > 100000:
        await i.response.send_message("❌ 범위 오류", ephemeral=True)
        return

    STOCKS[이름] = 값
    STOCK_HISTORY[이름].append(값)

    await i.response.send_message(f"{이름} → {값}")
  • 위 코드에서 STOCK_HISTORY가 반드시 초기화되어 있어야 함을 재확인한다.

추가 팁:

  • 에디터에서 "보이기(공백 문자)" 기능을 켜서 탭/스페이스 혼용을 확인한다.
  • 자동 포매터(예: black)나 린터(예: flake8)를 사용해 문법·스타일 문제를 사전에 잡는다.
  • 디스호스트와 같은 호스팅 플랫폼에 업로드한 후에는 컨테이너 재시작 또는 배포 재시작을 수행해야 변경사항이 반영된다.

마무리

핵심은 문법 오류(콜론 뒤의 불필요한 텍스트, 잘못된 할당)와 들여쓰기 일관성이다. 위 방식으로 상수와 자료구조를 명확히 선언하고 들여쓰기를 고치면 디스코드 봇의 IndentationError 문제를 해결할 수 있다.