
Die aktuelle Entwicklung für Call Map findet unter https://github.com/ajylee/call_map statt. Call Map ist ein Tool zur Navigation in Python-Call-Graphen.
.. default-role:: code
Call Map ist ein Werkzeug zur Navigation in Python-Aufrufgraphen, mit Plänen,
weitere Sprachen zu unterstützen. Unten sehen Sie einen Screenshot nach der
Ausführung von call_map -m toolz und anschließendem Klicken auf einige
Funktionen.
.. figure:: docs/UI-clicked-on-function.png
Während Call Map dazu dienen soll, ein allgemeines Verständnis einer Codebasis zu erlangen, eignet es sich auch hervorragend für die Verfolgung von Codepfaden, was ein wichtiges Sicherheitsanliegen darstellt. Viele Sicherheitsprobleme werden aufgedeckt, indem man einen Codepfad findet, der Benutzereingaben mit gefährlichen Codemustern verbindet.
Weitere Informationen finden Sie im Blogbeitrag__.
Call Map wird als Python-Paket für Python 3.5 verteilt. Zur Installation mit
pip3 führen Sie Folgendes aus::
pip3 install -e .
Beachten Sie, dass einige Python-3-Distributionen den Paketmanager pip nennen
und andere pip3. Möglicherweise müssen Sie pip3 durch pip ersetzen.
Die obigen Befehle sollten die ausführbare Datei call_map im selben Pfad
installieren, in dem sich der Python-Interpreter befindet.
Details und alternative Methoden finden Sie in INSTALL.rst.
Öffnen Sie Dateien, um mit der Erkundung zu beginnen::
call_map -f example.py
call_map -f *.py
Sie können auch zum Modulsuchpfad (sys.path) hinzufügen::
call_map -f *.py -p .
Call Map versucht, die Dateien als Module aufzulösen, sofern sie im
Modulsuchpfad gefunden werden können. Weitere Dokumentation zu den
Befehlszeilenargumenten finden Sie mit call_map -h.
Um Call Map zu konfigurieren, setzen Sie die Umgebungsvariable CALL_MAP_RC_DIRECTORY. Der Pfad zur Konfigurationsdatei von Call Map lautet::
$CALL_MAP_RC_DIRECTORY/call_map_rc.py
Derzeit sind die folgenden Konfigurationsoptionen verfügbar:
open_in_editor(path: pathlib.Path, line: int): Wenn Sie diese Funktion
definieren, wird sie bei jedem Öffnen einer Datei aufgerufen. Beispielsweise
kann Folgendes verwendet werden, um Dateien in einem Emacs-Server zu öffnen,
wenn Sie server-mode in einer laufenden Emacs-Sitzung aufgerufen haben::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['emacsclient', '+{}'.format(line), str(path)])
Das Folgende kann verwendet werden, um Dateien im GVim-Server zu öffnen, wenn
Sie einen GVim-Server mit gvim --servername my_vim_server gestartet haben::
def open_in_editor(path, line): import subprocess as sbp sbp.call(['gvim', '--servername', 'my_vim_server', '--remote', '+{}'.format(line), str(path)])
MULTITHREADING: Gibt an, ob ein separater Thread für die GUI und die Suche
im Aufrufgraphen verwendet werden soll. Standardwert ist True. Das
Deaktivieren dient Debugzwecken.
Es gibt einige Eigenheiten im UI-Design, weil ich noch keine bessere Lösung gefunden habe oder der Kompromiss aus zusätzlicher Komplexität ungünstig ist.
Verwendungen können scheinbar mehrfach angezeigt werden, tatsächlich handelt es sich aber um verschiedene Verwendungen im selben Gültigkeitsbereich.
Ihnen fällt vielleicht auf, dass einige Builtins wie help, id und
filter ignoriert werden. Die vollständige Liste der ignorierten Funktionen
finden Sie in call_map/config.py im Quellcode.
Wenn die hervorzuhebende Position am Anfang einer Datei liegt, wird sie nicht hervorgehoben. Das liegt daran, dass sich in der Regel nur Module und Skripte am Anfang ihrer jeweiligen Dateien befinden.
Einige Eigenheiten werden vom Python-Analyse-Backend jedi übernommen.
Der Suchbereich für Verwendungen ist die Menge der Module, die vom
jedi-Backend geladen wurden. Der Bereich ändert sich also, wenn Sie neue
Module erkunden. Wenn Sie ein Modul explizit in den Suchbereich aufnehmen
möchten, fügen Sie es der anfänglichen Liste der zu untersuchenden Module
hinzu.
jedi durchsucht immer den sys.path des Interpreters, auch wenn dieser
nicht explizit eingebunden ist, priorisiert jedoch den benutzerdefinierten
sys_path.
Alle Einschränkungen, die für statische Analyse-Backends gelten, gelten auch
für Call Map. (Derzeit ist nur das jedi-Backend in Call Map integriert.)
Das jedi-Backend für die Python-Analyse findet nicht immer alle Verwendungen.
Die dynamische Natur von Python macht es unmöglich, die Definition einer
Funktion mit statischer Analyse immer zu bestimmen. Manchmal löst jedi einen
Aufruf zu mehreren möglichen Funktionen auf. Beispielsweise hängt
os.path.abspath von der Plattform ab. In diesem Fall listet call_map beide
Möglichkeiten als abspath und abspath (2) auf. jedi löst auch nicht alle
Aufrufe und Verwendungen auf. Die eigene Dokumentation von Jedi enthält
ebenfalls eine Liste von Einschränkungen__.
Manchmal wirkt sich ein Fehler, den Jedi bei der Analyse eines Elements auslöst, auf andere Elemente aus. Wenn Jedi beispielsweise beim Suchen von Verwendungen einen Fehler bei einer Verwendung auslöst, sind die anderen gefundenen Verwendungen möglicherweise nicht wiederherstellbar (Stand Jedi v0.10.0).
__ https://jedi.readthedocs.io/en/latest/docs/features.html#caveats