python chdir 함수는 작업 디렉토리를 바꿀 때 쓰이는 함수입니다. linux cd 명령어랑 비슷하다고 생각하면 됩니다. 어떨 때 쓰는지 문제 상황을 간단하게 재현해 보도록 하겠습니다.
예제 프로그램 1
먼저, cho_test 라는 유저를 하나 생성했습니다. 홈 디렉토리가 있기 때문에, /home/cho_test는 유저 cho_test가 소유자입니다.
권한을 잠깐 봅시다. .는 현재 디렉토리로, /home 디렉토리를 의미합니다. 이 디렉토리는 소유자가 root이고, 소유 그룹도 root입니다. 고로, root가 아니면 r과 x 권한만을 가지게 됩니다. x 권한은 제가 아래 글에서 설명을 했으니, 관심이 있으면 보시는 것도 좋겠습니다.
즉, 해당 디렉토리에는 root는 쓰기 권한이 있지만, 나머지는 쓰기 권한이 없습니다. 고로, 해당 디렉토리 밑에 새로운 파일을 추가하는 것도 안 됩니다.
home 밑에 있는 cho_test 디렉토리를 보겠습니다. 여기에는 1.c가 있습니다. 컴파일이 에러 없이 되는 1.c 파일이고요. gcc 명령이 성공하면 실행 파일이 생성될 겁니다.
준비물은 모두 갖추었습니다. 이제, /home/cho_test 디렉토리 밑에 생성한 test1.py를 보겠습니다.
이 파일을 하나 하나 분석해 봅시다. 먼저 __file__은 해당 파일을 의미합니다. os.path.realpath는 절대 경로를 반환하는 함수입니다. 저는 /home/cho_test 디렉토리 밑에 test1.py를 생성했으므로, file_path의 값은 /home/cho_test/test1.py 가 될 겁니다.
os.path.dirname은 이 중 디렉토리 경로만 뽑아내는데요. /home/cho_test가 됩니다. 다음에 6번째 줄에, gcc 명령어를 실행하는데요. cho_test의 홈 디렉토리 밑에 있는 1.c를 컴파일 해서 1 이라는 이름을 가진 실행 파일로 만들려는 것입니다.
cho_test 유저로 /home 디렉토리에서 test1.py를 실행시켰습니다. 그랬더니 실행 거부가 떴습니다. 왜 그럴까요? 이는 작업 디렉토리가 cho_test가 아니라 home이였기 때문입니다. cho_test 는 home 디렉토리에 대해 write 권한이 없었습니다.
그런데 working_directory가 home입니다. 고로, subprocess 함수에서 실행된 command는 home에 컴파일 결과인 1을 생성하려고 시도합니다. 그런데, write 권한이 없네요. 막힙니다. amazon lambda의 경우 /var/task에서 실행되기 때문에, 해당 디렉토리에 write를 시도하는 경우 막히게 됩니다. 권한이 없기 때문이에요. 이를 해결하는 방법 중 하나는 working directory를 바꾸는 것입니다.
python chdir 함수로 작업 디렉터리 바꾸기
이제 chdir 함수를 보겠습니다.
이 함수를 보시면, working directory를 인자로 넘겨준 path로 바꾼다고 되어 있습니다. cd 명령어와 비슷해요. 한 번 사용해 봅시다.
다른 부분은 별 차이가 없고요. 1.c가 /home/cho_test에 있다고 했어요. cur_dir는 /home/cho_test가 됩니다. 제가 /home에서 python3 /home/cho_test/test2.py를 실행시키면, working directory는 홈 폴더가 되었을 겁니다.
그런데 os.chdir 함수 때문에, 작업 디렉터리가 바뀌게 됩니다.
유저 cho_test 는 해당 디렉터리에 대해, R, W, X 권한이 다 있습니다. 고로 실행 파일 1 역시 해당 위치에 생성할 수 있습니다. /home 폴더에서 test2.py를 실행시켜 보겠습니다.
아까와는 다르게, 프로그램이 실행되고, 실행파일 1도 cho_test에 생성되었음을 볼 수 있습니다. 왜 그럴까요?
- working_directory가 /home 이였지만
- chdir 함수 때문에 작업 디렉토리가 /home/cho_test 로 바뀌었습니다.
- cho_test는 해당 디렉토리에 쓰기 권한이 있었습니다.
따라서 컴파일 결과로 실행 파일 1이 작업 디렉토리에 올바르게 생성됩니다.