2023-04-11 TIL

0v0baek·2023년 4월 11일
0

TIL

목록 보기
26/92

[Django] subprocess-exited-with-error

문제 발생

python에서 dotenv를 설치하려고 하니 이런 오류가 뜬다.

error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [73 lines of output]
  """
  파일 경로와 오류 이야기
  """
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

내가 알아들은 것으론

1) pip 자체의 오류는 아니다.
2) python setup.py egg_info가 잘 돌아가지 않는다.

이 정도 였다.

이걸 기반으로 문제를 해결해보자.

시도 한 것들

1. pip랑 setuptools 최신버전인지 확인

pip 자체의 문제는 아니라고 했지만 혹시 모르니 설치에 필요한 pip이랑 setuptools를 모두 업그레이드 시켜보자.

# 둘 모두 똑같은 효과다.
python.exe -m pip install --upgrade pip
python -m pip install --upgrade pip

업그레이드 시키고 다시 설치했는데 여전히 안된다.
pip tool 자체의 문제는 아닌걸로.

2. requirements.txt에 있는 거 다 설치해보기

fork 해온 파일이 구동 안되는 게 문제니, fork 파일의 requirements.txt에 있는 걸 하나씩 다 설치해보자.

# 패키지 설치하기
>>>python -m pip install <설치할 모듈>

이렇게 요구하는 걸 다 설치했더니, 서버는 돌아간다

문제는, 서버가 돌아가기만 하고 제대로 작동이 안되는지 오류가 엄청 뜸...

3. env 파일 설정해주기

it doesn't exist.
  dotenv.read_dotenv()

오류 메세지를 보고 뭐가 문제인가 봤더니, dotenv.read_dotenv()가 존재하지 않는다고 한다.

오류를 타고 들어가보니, manage.py 파일 안에 있는 코드가 문제였다.

if __name__ == '__main__':
    dotenv.read_dotenv()
    main()

여기서 dotenv.read_dotenv() 함수는 .env라는 파일을 불러오는 건데, manage.py가 위치한 파일과 같은 위치에 .env라는 파일이 있어야 함수가 제대로 작동된다.

파일을 만들어주자.

만든 뒤에 파일 안에 SECRET KEY를 설정해줘야 한다.

SECRET_KEY=<시크릿 >

시크릿키는 함수로 생성받는 방법도 있으나, 나는 https://djecrety.ir/ 에서 시크릿키를 받아 넣고 있다.

추가로, .env에는 github에 올릴 때 숨기고 싶은 부분을 넣어서 할당시켜주면 된다.
값을 불러오는 코드는 아래와 같다.

os.environ.get('가져올 변수 이름')

이런식으로 하면 서버가 잘 굴러간다 !!
아 참, 항상 django로 fork 해올 땐 makemigrationsmigrate를 해줘야 db 적용이 제대로 된다.

[Python] upper와 lower

대문자와 소문자를 판별하기 위한 메소드

upper()

문자열을 대문자로 변경해주는 메소드.

word = 'imhappy'
word = word.upper()

print(word)

>>>IMHAPPY

lower()

문자열을 소문자로 변경해주는 메소드.

word = 'AREYOUHAPPY'
word = word.lower()

print(word)

>>>areyouhappy

isupper()

문자열이 대문자라면 True를 반환

word1 = 'abcd'
word2 = 'ABCD'

# abcd
print(word1.isupper())
# ABCD
print(word2.isupper())

>>>False
True

islower()

문자열이 소문자라면 True를 반환

word1 = 'abcd'
word2 = 'ABCD'

# abcd
print(word1.islower())
# ABCD
print(word2.islower())

>>>True
False

한 걸음 더 : 대문자와 소문자가 섞여있을 때

for문을 돌려주면 된다.

# 원본 문자열과 바꿀 빈 문자열
word = 'IMhappy'
answer = ''

for i in word:
		# 대문자일 경우
        if i.isupper() == True:
        		# 소문자로 변환
                answer += i.lower()
        # 소문자일 경우
        else:
        		# 대문자로 변환
                answer += i.upper()

print(answer)

>>>imHAPPY

[Python] list와 str 변환하기

str -> list

word = 'happy'

# str을 list로 변환 : list('문자열') or list(변수 이름)
my_list = list(word)

print(my_list)

>>>['h', 'a', 'p', 'p', 'y']

list -> str

my_list = ['h', 'a', 'p', 'p', 'y']

# .join([리스트]) or .join(변수 이름)
# .join 앞에는 리스트 요소를 하나로 합치면서 사이에 뭘 넣을지 써주기
# '' < 공백
word = ''.join(my_list)

print(word)

>>>happy

[Python] 문자열 정렬하기(2)

영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때,
my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보자!

내 답안

def solution(my_string):
    word = ''
    for string in my_string:
        if string.isupper() == True:
            string = string.lower()
        word += string
    return ''.join(sorted(word))

문자열을 하나씩 for문으로 돌려서
대문자인지 점검한 뒤 소문자로 바꾸어주고,
그걸 sorted로 정렬한 뒤
빈 문자열에 join 시켜줬다.

다른 답안

def solution(my_string):
    return ''.join(sorted(my_string.lower()))

헐...

for문 돌릴 필요 없이 문자열 전체를 그냥 lower 해주면 되는구나.
새로운 깨달음을 얻었다.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글