파이썬 책을 보다가 예전부터 가지고 있던 질문 중에 하나인 "파이썬 프로젝트에 적합한 디렉토리 구조"가 무엇인지 궁금해져서 조사를 시작했다.

간단한 프로젝트인 경우에는 디렉토리 구조가 큰 문제가 안되겠지만 몇 달씩 작업을 하는 프로젝트의 경우에는 디렉토리 구조을 잘 잡는 것도 중요한 문제 중에 하나다. Java 쪽에서는 이미 maven을 이용해서 디렉토리 구조를 생성하는 것이 사실상 표준이 됐는데, 파이썬이나 다른 언어에서는 이런 도구들은 없는지, 사람들은 보통 어떤 구조를 선호하는지, 혹시 어느 정도 표준안이 있는데 내가 모르고 있는 것은 아닌가 싶어 조사를 시작했다.

일단 구글링부터 시작했는데 나만 이런 생각을 하고 있었던 것은 아니었는지 이와 관련된 질문([2],[3])이나 글([1],[4],[5])들을 쉽게 찾을 수 있었다. 알고 보니 파이썬 쪽에서는 이게 패키징 문제와 엮여서 꽤나 중요한 문제였나보다. 파이썬의 패키징 프로그램(distutil, setuptools)의 문제로 인해 프로젝트 디렉토리 구조를 어떻게 잡느냐에 따라 패키징하고 배포 과정에서 버그가 많이 발생했기 때문이다. [5]를 보면 배포를 위해 파이썬 프로그램을 패키징하는데 정말 많은 신경을 써야 하는구나 싶다. 

그래서 어떤 글들을 보면 아래와 같이 프로젝트 디렉토리(여기서는 "funniest") 밑에 동일한 이름의 메인 패키지 디렉토리가 나온다. 패키킹 도구가 디렉토리 구조를 그대로 사용하기 때문에 메인 패키지 이름을 바꿀 수 없는 것 같다. 대부분의 경우 프로젝트 이름과 그 프로젝트에서 개발한 패키지 이름 (또는 프로그램 이름)이 동일하기 때문에 이런 일은 자주 발생한다.
1
2
3
4
funniest/
    funniest/
        __init__.py
    setup.py
cs

그런데 [1]을 보면 이것은 이미 옛날 이야기이고 아래와 같이 "src" 디렉토리를 사용할 것을 권하고 있다.  
├─ src
│  └─ packagename
│     ├─ __init__.py
│     └─ ...
├─ tests
│  └─ ...
└─ setup.py

당분간은 내가 작성하는 코드들이 패키징되서 배포될 일도 없고, 개인적으로 동일한 이름의 디렉토리가 있는 것보다 이게 더 보기 좋기 때문에 앞으로 내가 담당하는 프로젝트에서는 "src" 디렉토리를 만드는 안을 선택하려고 한다.

"src" 디렉토리 사용 여부 말고도 이슈가 하나 더 있는데 바로 단위 테스트용 코드를 어디에 놓을 건인가 하는 문제다. 프로젝트 최상위 디렉토리 밑에, 즉 src와 동일한 곳에 "tests" 디렉토리를 만드는 것은 상당히 보편화된 것 같다. 그런데 여기에다만 테스트 코드를 놓을 것인지, 아니면 src/pck1 밑에 tests 디렉토리를 만들고 실제 테스트 코드는 여기에 놓을 것인지에 대해서는 사람마다 다르다. 개인적으로는 $PROJECT_ROOT/tests에 넣는 것이 실행 코드와 테스트 코드를 더욱 명확하게 분리할 수 있기 때문에 더 좋다고 생각한다.

여기에 사전이나 메타 데이터를 저장하는 rsc/, 문서를 저장할 docs/, 유틸성 스크립트를 저장할 scripts/, 마지막으로 README.rst까지 포함하면 아래와 같은 구성이 된다. 

$PROJECT_ROOT
 ├─ README.rst
 ├─ docs
 ├─ rsc
 ├─ src
 │  ├─ packagae
 │     ├─ __init__.py
 │     └─ ...
 │  └─ main.py ....
 ├─ tests
 │  ├─ package
 │     └─ ...
 |  └─ test_main.py
 └─ setup.py

꼭 필요한 것들만 넣어서 간단하게 만들려고 해도 꽤 복잡해졌다. 게으름을 추구하는 똑똑한 프로그래머분들이 이런 귀찮은 작업을 매번 반복하지 말라고 cookiecutter([6], [7])라는 것을 만들었다. 그런데 이건 단위 테스트는 물론이고 CI, code coverage 도구 연동, 다중 python 버전 지원 등등 기능이 워낙 많아져서 회사 프로젝트처럼 사용할 수 있는 도구도 한정되고, 외부로 코드 공개를 할 수도 없는 경우에는 배보다 배꼽이 더 클 것 같다.

프로젝트 디렉토리 구조는 프로젝트를 새로 시작할 때마다 신경쓰였던 문제였는데, 마침 급한 일도 끝난 시점에 이렇게 조사, 정리를 하게 되서 나름 뿌듯하다. 이 주제가 생각만큼 단순하지 않고 그동안 많은 이슈들이 있었다는 점에서 한편으로는 놀랍기도 했고, 다른 한편으로는 새로운 사실들을 많이 알게되서 재밌기도 했다.


참고자료



WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

트랙백  0 , 댓글  0개가 달렸습니다.
secret