본문 바로가기
IT 기술/프로그래밍관련

[python] snakefood : module dependency check

by 땅뚱 2014. 6. 25.

파이썬의 장점중 하나는 제공되는 엄청난 양의 모듈이다.


각 모듈간에 어떤 의존성이 있는지 확인할 필요성이 생겼는데, 하나씩 파일을 뒤져봐야하는지 고민하다가, 의존성 체크해주는 툴이 있을 것이라는 얘기를 듣고 찾아보았다.


snakefood 라는 좋은 툴이 있는 것을 확인했다.(http://furius.ca/snakefood/) 파이썬이 뱀의 이름(사실 뱀과는 아무런 관련이 없지만)이라서 snakefood 인가?


관련 내용을 정리해보았다.


snakefood 의 특징


1. Python Parsing 을 위해서 AST(abstract syntax tree) 를 사용한다.

2. 모듈을 load 하지 않는다.

3. 체크를 위한 script 를 준비할 필요가 없이 파일이 들어있는 디렉토리를 선택해주면 된다.

4. 설정이 필요없다.

5. "한가지를 잘하는 작은 프로그램이 좋은 것" 이라는 UNIX 철학을 따른다.


snakefood 는 python 2.5 이상에서 동작한다.


snakefood source download 방법

snakefood 는 mercurial repository 를 사용한다.


주소 : http://hg.furius.ca/public/snakefood/


소스 다운로드 명령 : hg clone http://hg.furius.ca/public/snakefood


(여기서 다음과 같은 에러가 발생한다면 다음을 참고하라 : 링크)

abort: error: _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed



snaketood tool 설명

Tools

설명

 sfood

 주어진 파일이나, root 디렉토리에  대해서 dependency list 를 생성한다

 -f, --follow : dependency 를 마지막까지 찾아서 출력해준다. 기본값은 첫번째 depth 까지만 진행한다

 -i, --internal : root 디렉토리내에서의 dependency 만 출력한다.

 -e, --external : root 디렉토리이외에서 dependency 만 출력한다.

 -v, --verbose : 실행정보에 대한 상세내용을 출력한다.

 sfood-graph

 dependency list 를 읽어서 Graphviz dot 파일을 생성한다. PDF 파일을 생성하기 위해서는 Graphviz dot 툴이 있어야 한다.

 sfood-cluster

 dependency 파일이나 파일 묶음을 읽고 중복된 내용을 없앤 dependency list 를 출력한다

 sfood-checker

 AST 를 사용하여 코드를 분석하고, 사용되지 않거나, 중복되는 import 를 분석한다

 sfood-imports

 python 파일에서 import 문을 찾아서 list 한다



snakefood 설치

소스를 다운로드 받았다면 아래 명령을 사용하여 설치를 진행한다. 설치시에는 root 권한이 필요하다


# cd snakefood

# sudo python setup.py install


ubuntu 의 경우 apt-get 명령으로 이미 빌드된 이미지를 설치할 수 있다.


# sudo apt-get install snakefood


snakefood 사용법


매뉴얼 페이지 : http://furius.ca/snakefood/doc/snakefood-doc.html


sfood [<file_name>|<root_directory>] [option]


출력 결과 포맷은 아래와 같다. source -> dest 의 의존성 관계를 표시해 준다.

((<source_package_root>, <source_file.py>), (<dest_package_root>, <dest_file.py>))


의존성이 없는 경우에도 해당 node 를 표시해주기 위해서 아래와 같이 출력된다. 아래 내용은 graph 출력시 node 를 표현하기 위해서 사용된다.


((<source_package_root>, <source_file.py>), (None, None))


sfood-cluster -f <cluster_file>


일반적으로 아래와 같이 사용한다. cluster_file 은 소스 트리에서 find, ls 를 사용해서 수동으로 만들어야 한다.

# Generate the raw dependencies. sfood /myproject > /tmp/raw.deps # Filter and cluster. cd /myproject ; ls -1d * > /tmp/clusters cat /tmp/raw.deps | grep -v test_widget | sfood-cluster -f /tmp/clusters > /tmp/filt.deps # Generate the graph. cat /tmp/filt.deps | sfood-graph -p | dot -Tps | pstopdf -i -o /tmp/myproject.pd


위 내용을 Makefile 로 만들면 편하게 사용할 수 있다.


NAME = myproject
ROOT = /path/to/myproject
PDFS = $(NAME).pdf

.SUFFIXES: .deps .dot .pdf .clusters

all: $(PDFS)

raw.deps: $(ROOT)
        sfood -i $(ROOT) $(FOOD_FLAGS) > $@

$(NAME).clusters: $(ROOT)
        cd $(ROOT) ; ls -1d * > $(shell pwd)/$@

$(NAME).deps: $(NAME).clusters raw.deps
        cat raw.deps | sfood-cluster -f $< > $@

.deps.pdf:
        cat $< | sfood-graph | dot -Tps | ps2pdf - $@

clean:
        rm -f *.clusters *.dot *.pdf
        ls -1 *.deps | grep -v ^raw.deps | xargs rm -f

realclean: clean
        rm -f raw.deps


'IT 기술 > 프로그래밍관련' 카테고리의 다른 글

[Python] if __name__ == "__main__": 의미  (14) 2014.09.17
[Python] str() 과 repr() 의 차이  (3) 2014.06.17
[bash] script debugging  (0) 2013.10.11
[bash] 5th - Trap Statement  (0) 2013.08.01
[linux] openat / open 의 차이점  (0) 2012.12.28