파이썬의 장점중 하나는 제공되는 엄청난 양의 모듈이다.
각 모듈간에 어떤 의존성이 있는지 확인할 필요성이 생겼는데, 하나씩 파일을 뒤져봐야하는지 고민하다가, 의존성 체크해주는 툴이 있을 것이라는 얘기를 듣고 찾아보았다.
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 |