
Current development for Call Map takes place at https://github.com/ajylee/call_map. Call Map is a tool for navigating Python call graphs.
.. default-role:: code
Call Map 是一款用于在 Python 中导航调用图的工具,并计划支持其他语言。下面是运行 call_map -m toolz 后点击一些函数时的屏幕截图。
.. figure:: docs/UI-clicked-on-function.png
虽然 Call Map 旨在帮助大致了解代码库,但它也非常适合追踪代码路径,这构成了一个重要的安全关注点。许多安全问题都是通过找到一条将用户输入连接到危险编码模式的代码路径而暴露出来的。
更多信息请参阅 博客文章__。
Call Map 以 Python 包的形式分发,适用于 Python 3.5。要使用 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 设计中存在一些怪癖,原因是我尚未找到更好的解决方案,或者增加复杂性的代价并不划算。
使用处可能会显示多次,但实际上它们是同一作用域中的不同使用处。
你可能会注意到 help、id 和 filter 等一些内建函数会被忽略。有关被忽略函数的完整列表,请参阅源代码中的 call_map/config.py。
如果要高亮的位置位于文件开头,则它不会被高亮。这是因为通常只有模块和脚本位于各自文件的开头。
有些怪癖继承自 jedi Python 分析后端。
使用处的搜索范围是 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