
Current development for Call Map takes place at https://github.com/ajylee/call_map. Call Map은 Python 호출 그래프를 탐색하기 위한 도구입니다.
.. default-role:: code
Call Map은 Python의 호출 그래프를 탐색하기 위한 도구로, 다른 언어도
지원할 계획입니다. 아래는 call_map -m toolz를 실행한 후 일부 함수를
클릭한 스크린샷입니다.
.. figure:: docs/UI-clicked-on-function.png
Call Map은 코드베이스에 대한 전반적인 이해를 돕기 위한 도구이지만, 중요한 보안 문제와 직결되는 코드 경로 추적에도 자연스럽게 적합합니다. 많은 보안 문제는 사용자 입력을 위험한 코딩 패턴에 연결하는 코드 경로를 찾아냄으로써 드러납니다.
자세한 내용은 블로그 게시물__을 참조하세요.
Call Map은 Python 3.5용 Python 패키지로 배포됩니다. pip3로
설치하려면 다음을 실행하세요::
pip3 install -e .
일부 Python 3 배포판에서는 패키지 관리자를 pip라고 부르고 일부는
pip3라고 부르므로 pip3를 pip로 바꿔야 할 수도 있습니다.
위 명령은 실행 파일 call_map을 Python 인터프리터가 있는 동일한 경로에
설치합니다.
자세한 내용과 대체 방법은 INSTALL.rst를 참조하세요.
탐색을 시작하려면 파일을 여세요::
call_map -f example.py
call_map -f *.py
모듈 검색 경로(sys.path)를 확장할 수도 있습니다::
call_map -f *.py -p .
Call Map은 파일이 모듈 검색 경로에서 발견될 때마다 해당 파일을 모듈로
해석하려고 시도합니다. 명령줄 인수에 대한 자세한 문서는 call_map -h를
참조하세요.
Call Map을 구성하려면 환경 변수 CALL_MAP_RC_DIRECTORY를 설정하세요. Call Map 구성 파일의 경로는 다음과 같습니다::
$CALL_MAP_RC_DIRECTORY/call_map_rc.py
현재 구성 옵션은 다음과 같습니다:
open_in_editor(path: pathlib.Path, line: int): 이 함수를 정의하면
파일을 열 때마다 호출됩니다. 예를 들어, 실행 중인 Emacs 세션에서
server-mode를 호출한 경우 다음 코드를 사용하여 Emacs 서버에서 파일을
열 수 있습니다::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['emacsclient', '+{}'.format(line), str(path)])
gvim --servername my_vim_server로 GVim 서버를 시작한 경우 다음
코드를 사용하여 GVim 서버에서 파일을 열 수 있습니다::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['gvim', '--servername', 'my_vim_server', '--remote', '+{}'.format(line), str(path)])
MULTITHREADING: GUI와 호출 그래프 검색에 별도의 스레드를 사용할지
여부입니다. 기본값은 True입니다. 끄는 것은 디버그 목적입니다.
UI 설계에는 몇 가지 특이 사항이 있습니다. 더 나은 해결책을 찾지 못했거나 추가 복잡성에 따른 트레이드오프가 불리하기 때문입니다.
사용처가 두 번 이상 표시되는 것처럼 보일 수 있지만, 실제로는 동일한 범위(scope)에서의 서로 다른 사용처입니다.
help, id, filter와 같은 일부 내장 함수(builtin)는 무시된다는 점을
알 수 있습니다. 무시되는 함수의 전체 목록은 소스 코드의
call_map/config.py를 참조하세요.
강조 표시할 위치가 파일의 시작 부분에 있으면 강조 표시되지 않습니다. 일반적으로 모듈과 스크립트만 해당 파일의 시작 부분에 위치하기 때문입니다.
일부 특이 사항은 Python 분석 백엔드인 jedi에서 상속된 것입니다.
사용처 검색 범위는 jedi 백엔드가 로드한 모듈 집합입니다. 즉, 새
모듈을 탐색하면 범위가 변경됩니다. 검색 범위에 모듈을 명시적으로
포함하려면 검사할 초기 모듈 목록에 추가하세요.
jedi는 명시적으로 포함되지 않은 경우에도 항상 인터프리터의
sys.path를 검색합니다. 그러나 사용자 정의 sys_path를 우선시합니다.
정적 분석 백엔드에 존재하는 모든 주의 사항은 Call Map에도 적용됩니다.
(현재는 jedi 백엔드만 Call Map에 통합되어 있습니다.)
Python 분석용 jedi 백엔드는 항상 모든 사용처를 찾지는 못합니다. Python의
동적 특성상 정적 분석으로 함수의 정의를 항상 결정하는 것은 불가능합니다.
때로는 jedi가 호출을 여러 가능한 함수로 해석하기도 합니다. 예를 들어
os.path.abspath는 플랫폼에 따라 달라집니다. 이 경우 call_map은 두
가능성을 abspath와 abspath (2)로 나열합니다. jedi는 또한 모든 호출과
사용처를 해석하지 못합니다. Jedi 자체 문서에도 주의 사항 목록__이
있습니다.
때로는 Jedi가 항목 하나를 분석할 때 오류를 발생시키면 그 오류가 다른 항목에도 영향을 미칩니다. 예를 들어, 사용처를 찾을 때 Jedi가 한 사용처에서 오류를 발생시키면, 찾은 다른 사용처는 복구할 수 없을 수 있습니다(Jedi v0.10.0 기준).
__ https://jedi.readthedocs.io/en/latest/docs/features.html#caveats