Skip to main content

:warning: Notes

Forked from https://github.com/vitsalis/pycg

Changes: See https://github.com/deeplime-io/PyCG/tree/onecode

Essentially added code tracks the order of the calls and the code associated to it. It is used by OneCode to properly interpret code based on the excellent PyCG.

Why a new PyPi package? Well, the not-so-great PyPi doesn't allow to have forked public repositories as part of the dependencies. Nice right?

PyCG - Practical Python Call Graphs

Tests

PyCG generates call graphs for Python code using static analysis. It efficiently supports

  • Higher order functions
  • Twisted class inheritance schemes
  • Automatic discovery of imported modules for further analysis
  • Nested definitions

You can read the full methodology as well as a complete evaluation on the ICSE 2021 paper.

You can cite PyCG as follows. Vitalis Salis, Thodoris Sotiropoulos, Panos Louridas, Diomidis Spinellis and Dimitris Mitropoulos. PyCG: Practical Call Graph Generation in Python. In 43rd International Conference on Software Engineering, ICSE '21, 25–28 May 2021.

PyCG is archived. Due to limited availability, no further development improvements are planned. Happy to help anyone that wants to create a fork to continue development.

Installation

PyCG is implemented in Python3 and requires Python 3.10–3.14. It also has no dependencies. Simply:

pip install onecode-pycg

Usage

~ >>> pycg -h
usage: __main__.py [-h] [--package PACKAGE] [--product PRODUCT]
                        [--forge FORGE] [--version VERSION] [--timestamp TIMESTAMP]
                        [--max-iter MAX_ITER] [--operation {call-graph,key-error}]
                        [--as-graph-output AS_GRAPH_OUTPUT] [-o OUTPUT]
                        [entry_point ...]

positional arguments:
  entry_point           Entry points to be processed

optional arguments:
  -h, --help            show this help message and exit
  --package PACKAGE     Package containing the code to be analyzed
  --max-iter MAX_ITER   Maximum number of iterations through source code. If not specified a fix-point iteration will be performed.
  --operation {call-graph,key-error}
                        Operation to perform. Choose call-graph for call graph generation (default) or key-error for key error detection on dictionaries.
  --as-graph-output AS_GRAPH_OUTPUT
                        Output for the assignment graph
  -o OUTPUT, --output OUTPUT
                        Output path

Call Graph Output

Simple JSON format

The call edges are in the form of an adjacency list where an edge (src, dst) is represented as an entry of dst in the list assigned to key src:

{
    "node1": ["node2", "node3"],
    "node2": ["node3"],
    "node3": []
}

FASTEN Format

Dropped - not useful for OneCode and requires porting of pkg_resources

For an up-to-date description of the FASTEN format refer to the FASTEN wiki.

Key Errors Output

We are currently experimenting on identifying potential invalid dictionary accesses on Python dictionaries (key errors). The output format for key errors is a list of dictionaries containing:

  • The file name in which the key error was identified
  • The line number inside the file
  • The namespace of the accessed dictionary
  • The key used to access the dictionary
[{
    "filename": "mod.py",
    "lineno": 2,
    "namespace": "mod.<dict1>",
    "key": "key2"
},
{
    "filename": "mod.py",
    "lineno": 8,
    "namespace": "mod.<dict1>",
    "key": "nokey"
}]

Examples

All the entry points are known and we want the simple JSON format

~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json

All entry points are not known and we want the simple JSON format

~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json

Running Tests

From the root directory, first install the mock package:

pip3 install mock

Τhen, simply run the tests by executing:

make test

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

onecode_pycg-1.2.1.tar.gz (54.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

onecode_pycg-1.2.1-py3-none-any.whl (56.9 kB view details)

Uploaded Python 3

File details

Details for the file onecode_pycg-1.2.1.tar.gz.

File metadata

  • Download URL: onecode_pycg-1.2.1.tar.gz
  • Upload date:
  • Size: 54.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for onecode_pycg-1.2.1.tar.gz
Algorithm Hash digest
SHA256 7ddfd444e57fc6129e4c39eb0b68e26b3af958cb1e630564cb83a0f68ef90a33
MD5 4e3da827080af567cecc086404f655aa
BLAKE2b-256 83436a5510d379dcb7bcd21b50b2007dc0784da01723d2152b1e6d5748877afc

See more details on using hashes here.

File details

Details for the file onecode_pycg-1.2.1-py3-none-any.whl.

File metadata

  • Download URL: onecode_pycg-1.2.1-py3-none-any.whl
  • Upload date:
  • Size: 56.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for onecode_pycg-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aa0db8be04cc8abea907add69b32370c1cd55350d7f56b8a3f902cbfbb58fc8c
MD5 5cbb75d2147ea22c25afc6fceba6a81a
BLAKE2b-256 6b67ef2f502a0a987a44e4261d5c6b5e170a1d2f7260523c3089071bb4d2c927

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 files

1.2.0

2 files

0.0.8

1 file

0.0.7

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page