Overview

The pyoxy Executable

PyOxy is distributed as a pyoxy compiled executable. This executable links against a Python implementation/distribution (i.e. libpython).

The Python implementation/distribution and any resources defined in its standard library may be compiled statically into the pyoxy executable. This enables pyoxy to function as a single file Python distribution. (This is how official builds of pyoxy are distributed.)

pyoxy’s int main() is implemented in Rust. It simply parses the process arguments and executes a sub-command.

Full Python Interpreter Control

Commands like pyoxy run-yaml (see Running YAML Based Applications) give you very low-level control over the behavior of the Python interpreter: much lower than what is possible with python command arguments or environment variables.

This control can be useful for iterating/testing on different Python embedding configurations (such as how you would need to configure PyOxidizer). The control can also be useful for use in automated testing where you may want to simulate an embedded Python configuration but don’t want to produce your own executable for each configuration variation. With commands like pyoxy run-yaml, you can simply define a YAML file defining the interpreter configuration and use a single executable for driving the Python interpreter N ways.

Additional Python Features

pyoxy supplements the built-in features of python with its own.

With pyoxy, you can:

  • Dynamically choose from the system, jemalloc, mimalloc, or snmalloc memory allocators.

  • Easily leverage the oxidized_importer extension module for importing Python modules and loading file-based resources faster than the official importers in the Python standard library.

  • Automatically discover the location of the terminfo database at runtime, helping to ensure terminal functionality works as intended.

  • Automatically write a file containing a list of imported modules when the Python interpreter finalizes.

  • And more.

pyoxy aims to expose all the value-added features implemented in the pyembed Rust crate via the CLI so Python developers can harness these features without having to use something more heavyweight, like PyOxidizer.

Masquerading as python

The pyoxy run-python command can be used to make the executable behave like python would. e.g. pyoxy run-python -- -c "print('hello, world')".

In addition, if the pyoxy executable’s file name begins with python (e.g. python, python3, python3.9, python.exe), its custom argument parsing is short-circuited and the executable will behave as if it is actually python. This theoretically enables pyoxy to be used as a drop-in replacement for python.

$ mv pyoxy python
$ ./python
Python 3.9.5 (default, May 11 2021, 08:20:37)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>