***
PEX
***
.. image:: https://github.com/pex-tool/pex/actions/workflows/ci.yml/badge.svg?branch=main
:target: https://github.com/pex-tool/pex/actions?query=branch%3Amain+workflow%3ACI
.. image:: https://img.shields.io/pypi/l/pex.svg
:target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/v/pex.svg
:target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/pyversions/pex.svg
:target: https://pypi.org/project/pex/
.. image:: https://img.shields.io/pypi/wheel/pex.svg
:target: https://pypi.org/project/pex/#files
.. image:: https://img.shields.io/discord/1205942638763573358
:target: https://pex-tool.org/discord
.. contents:: **Contents**
Overview
========
pex is a library for generating .pex (Python EXecutable) files which are
executable Python environments in the spirit of `virtualenvs <https://virtualenv.pypa.io>`_.
pex is an expansion upon the ideas outlined in
`PEP 441 <https://peps.python.org/pep-0441/>`_
and makes the deployment of Python applications as simple as ``cp``. pex files may even
include multiple platform-specific Python distributions, meaning that a single pex file
can be portable across Linux and OS X.
pex files can be built using the ``pex`` tool. Build systems such as `Pants
<http://pantsbuild.org/>`_, `Buck <http://facebook.github.io/buck/>`_, and `{py}gradle <https://github.com/linkedin/pygradle>`_ also
support building .pex files directly.
Still unsure about what pex does or how it works? Watch this quick lightning
talk: `WTF is PEX? <https://www.youtube.com/watch?v=NmpnGhRwsu0>`_.
pex is licensed under the Apache2 license.
Installation
============
To install pex, simply
.. code-block:: bash
$ pip install pex
You can also build pex in a git clone using uv:
.. code-block:: bash
$ uv run dev-cmd package
$ cp dist/pex ~/bin
This builds a pex binary in ``dist/pex`` that can be copied onto your ``$PATH``.
The advantage to this approach is that it keeps your Python environment as empty as
possible and is more in-line with what pex does philosophically.
Simple Examples
===============
Launch an interpreter with ``requests``, ``flask`` and ``psutil`` in the environment:
.. code-block:: bash
$ pex requests flask 'psutil>2,<3'
Save Dependencies From Pip
~~~~~~~~~~~~~~~~~~~~~~~~~~
Or instead freeze your current virtualenv via requirements.txt and execute it anywhere:
.. code-block:: bash
$ pex $(pip freeze) -o my_virtualenv.pex
$ deactivate
$ ./my_virtualenv.pex
Ephemeral Environments
~~~~~~~~~~~~~~~~~~~~~~
Run webserver.py in an environment containing ``flask`` as a quick way to experiment:
.. code-block:: bash
$ pex flask -- webserver.py
Launch Sphinx in an ephemeral pex environment using the Sphinx entry point ``sphinx:main``:
.. code-block:: bash
$ pex sphinx -e sphinx:main -- --help
Using Entry Points
~~~~~~~~~~~~~~~~~~
Projects specifying a ``console_scripts`` entry point in their configuration
can build standalone executables for those entry points.
To build a standalone ``pex-tools-executable.pex`` binary that runs the
``pex-tools`` console script found in all pex version ``2.1.35`` and newer distributions:
.. code-block:: bash
$ pex "pex>=2.1.35" --console-script pex-tools --output-file pex-tools-executable.pex
Specifying A Specific Interpreter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can also build pex files that use a specific interpreter type:
.. code-block:: bash
$ pex "pex>=2.1.35" -c pex-tools --python=pypy -o pex-tools-pypy-executable.pex
Most pex options compose well with one another, so the above commands can be
mixed and matched, and equivalent short options are available.
For a full list of options, just type ``pex --help``.
Documentation
=============
More documentation about Pex, building .pex files, and how .pex files work
is available at https://docs.pex-tool.org.
Development
===========
Pex uses `uv <https://docs.astral.sh/uv/>`_ with `dev-cmd <https://pypi.org/project/dev-cmd/>`_ for
test and development automation. After you have installed `uv`, to run the Pex test suite, just
run `dev-cmd` via `uv`:
.. code-block:: bash
$ uv run dev-cmd
The `dev-cmd` command runner provides many useful options, explained at
https://pypi.org/project/dev-cmd/ . Below, we provide some of the most commonly used commands when
working on Pex, but the docs are worth acquainting yourself with to better understand how `dev-cmd`
works and how to execute more advanced work flows.
To run a specific command, identify the name of the command you'd like to invoke by running
``uv run dev-cmd --list``, then invoke the command by name like this:
.. code-block::
$ uv run dev-cmd format
That's a fair bit of typing. An shell alias is recommended, and the standard is `uvrc` which I'll
use from here on out.
To run MyPy:
.. code-block::
$ uvrc typecheck
All of our tests allow passthrough arguments to `pytest`, which can be helpful to run specific
tests:
.. code-block::
$ uvrc test-py37-integration -- -k test_reproducible_build
To run Pex from source, rather than through what is on your PATH, invoke via Python:
.. code-block::
$ python -m pex
Raw data
{
"_id": null,
"home_page": "https://github.com/pex-tool/pex",
"name": "pex",
"maintainer": null,
"docs_url": null,
"requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.15,>=2.7",
"maintainer_email": null,
"keywords": "package, executable, virtualenv, lock, freeze",
"author": "The PEX developers",
"author_email": "developers@pex-tool.org",
"download_url": "https://files.pythonhosted.org/packages/b6/51/96bc30e1d47ef900b717d5baeec9746733d183b08504dbfca470d23a5dd8/pex-2.48.2.tar.gz",
"platform": null,
"description": "***\nPEX\n***\n.. image:: https://github.com/pex-tool/pex/actions/workflows/ci.yml/badge.svg?branch=main\n :target: https://github.com/pex-tool/pex/actions?query=branch%3Amain+workflow%3ACI\n\n.. image:: https://img.shields.io/pypi/l/pex.svg\n :target: https://pypi.org/project/pex/\n\n.. image:: https://img.shields.io/pypi/v/pex.svg\n :target: https://pypi.org/project/pex/\n\n.. image:: https://img.shields.io/pypi/pyversions/pex.svg\n :target: https://pypi.org/project/pex/\n\n.. image:: https://img.shields.io/pypi/wheel/pex.svg\n :target: https://pypi.org/project/pex/#files\n\n.. image:: https://img.shields.io/discord/1205942638763573358\n :target: https://pex-tool.org/discord\n\n.. contents:: **Contents**\n\nOverview\n========\npex is a library for generating .pex (Python EXecutable) files which are\nexecutable Python environments in the spirit of `virtualenvs <https://virtualenv.pypa.io>`_.\npex is an expansion upon the ideas outlined in\n`PEP 441 <https://peps.python.org/pep-0441/>`_\nand makes the deployment of Python applications as simple as ``cp``. pex files may even\ninclude multiple platform-specific Python distributions, meaning that a single pex file\ncan be portable across Linux and OS X.\n\npex files can be built using the ``pex`` tool. Build systems such as `Pants\n<http://pantsbuild.org/>`_, `Buck <http://facebook.github.io/buck/>`_, and `{py}gradle <https://github.com/linkedin/pygradle>`_ also\nsupport building .pex files directly.\n\nStill unsure about what pex does or how it works? Watch this quick lightning\ntalk: `WTF is PEX? <https://www.youtube.com/watch?v=NmpnGhRwsu0>`_.\n\npex is licensed under the Apache2 license.\n\n\nInstallation\n============\n\nTo install pex, simply\n\n.. code-block:: bash\n\n $ pip install pex\n\nYou can also build pex in a git clone using uv:\n\n.. code-block:: bash\n\n $ uv run dev-cmd package\n $ cp dist/pex ~/bin\n\nThis builds a pex binary in ``dist/pex`` that can be copied onto your ``$PATH``.\nThe advantage to this approach is that it keeps your Python environment as empty as\npossible and is more in-line with what pex does philosophically.\n\n\nSimple Examples\n===============\n\nLaunch an interpreter with ``requests``, ``flask`` and ``psutil`` in the environment:\n\n.. code-block:: bash\n\n $ pex requests flask 'psutil>2,<3'\n\nSave Dependencies From Pip\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nOr instead freeze your current virtualenv via requirements.txt and execute it anywhere:\n\n.. code-block:: bash\n\n $ pex $(pip freeze) -o my_virtualenv.pex\n $ deactivate\n $ ./my_virtualenv.pex\n\nEphemeral Environments\n~~~~~~~~~~~~~~~~~~~~~~\n\nRun webserver.py in an environment containing ``flask`` as a quick way to experiment:\n\n.. code-block:: bash\n\n $ pex flask -- webserver.py\n\nLaunch Sphinx in an ephemeral pex environment using the Sphinx entry point ``sphinx:main``:\n\n.. code-block:: bash\n\n $ pex sphinx -e sphinx:main -- --help\n\nUsing Entry Points\n~~~~~~~~~~~~~~~~~~\n\nProjects specifying a ``console_scripts`` entry point in their configuration\ncan build standalone executables for those entry points.\n\nTo build a standalone ``pex-tools-executable.pex`` binary that runs the\n``pex-tools`` console script found in all pex version ``2.1.35`` and newer distributions:\n\n.. code-block:: bash\n\n $ pex \"pex>=2.1.35\" --console-script pex-tools --output-file pex-tools-executable.pex\n\nSpecifying A Specific Interpreter\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can also build pex files that use a specific interpreter type:\n\n.. code-block:: bash\n\n $ pex \"pex>=2.1.35\" -c pex-tools --python=pypy -o pex-tools-pypy-executable.pex\n\nMost pex options compose well with one another, so the above commands can be\nmixed and matched, and equivalent short options are available.\n\nFor a full list of options, just type ``pex --help``.\n\n\nDocumentation\n=============\n\nMore documentation about Pex, building .pex files, and how .pex files work\nis available at https://docs.pex-tool.org.\n\n\nDevelopment\n===========\n\nPex uses `uv <https://docs.astral.sh/uv/>`_ with `dev-cmd <https://pypi.org/project/dev-cmd/>`_ for\ntest and development automation. After you have installed `uv`, to run the Pex test suite, just\nrun `dev-cmd` via `uv`:\n\n.. code-block:: bash\n\n $ uv run dev-cmd\n\nThe `dev-cmd` command runner provides many useful options, explained at\nhttps://pypi.org/project/dev-cmd/ . Below, we provide some of the most commonly used commands when\nworking on Pex, but the docs are worth acquainting yourself with to better understand how `dev-cmd`\nworks and how to execute more advanced work flows.\n\nTo run a specific command, identify the name of the command you'd like to invoke by running\n``uv run dev-cmd --list``, then invoke the command by name like this:\n\n.. code-block::\n\n $ uv run dev-cmd format\n\nThat's a fair bit of typing. An shell alias is recommended, and the standard is `uvrc` which I'll\nuse from here on out.\n\nTo run MyPy:\n\n.. code-block::\n\n $ uvrc typecheck\n\nAll of our tests allow passthrough arguments to `pytest`, which can be helpful to run specific\ntests:\n\n.. code-block::\n\n $ uvrc test-py37-integration -- -k test_reproducible_build\n\nTo run Pex from source, rather than through what is on your PATH, invoke via Python:\n\n.. code-block::\n\n $ python -m pex\n\n",
"bugtrack_url": null,
"license": null,
"summary": "The PEX packaging toolchain.",
"version": "2.48.2",
"project_urls": {
"Changelog": "https://github.com/pex-tool/pex/blob/v2.48.2/CHANGES.md",
"Documentation": "https://docs.pex-tool.org/",
"Download": "https://github.com/pex-tool/pex/releases/download/v2.48.2/pex",
"Homepage": "https://github.com/pex-tool/pex",
"Source": "https://github.com/pex-tool/pex/tree/v2.48.2"
},
"split_keywords": [
"package",
" executable",
" virtualenv",
" lock",
" freeze"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "45878e7b52c54e560e4759d5e045f1349a91bfdb11069e2c1b61e0b71fec3775",
"md5": "3970313f4def51ebd86498d1fb15ce4b",
"sha256": "bf5985dcadc418cc16549d3d7d1a7c374ad568127e62cd82a564b2090397375a"
},
"downloads": -1,
"filename": "pex-2.48.2-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "3970313f4def51ebd86498d1fb15ce4b",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.15,>=2.7",
"size": 3852012,
"upload_time": "2025-07-28T04:43:55",
"upload_time_iso_8601": "2025-07-28T04:43:55.206315Z",
"url": "https://files.pythonhosted.org/packages/45/87/8e7b52c54e560e4759d5e045f1349a91bfdb11069e2c1b61e0b71fec3775/pex-2.48.2-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b65196bc30e1d47ef900b717d5baeec9746733d183b08504dbfca470d23a5dd8",
"md5": "434cfaa2f7150679e92bd15c0e6eef4f",
"sha256": "5520bec2b574455fe6a1628ed36810157f1995748a80fca60e0d9194293933e1"
},
"downloads": -1,
"filename": "pex-2.48.2.tar.gz",
"has_sig": false,
"md5_digest": "434cfaa2f7150679e92bd15c0e6eef4f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.15,>=2.7",
"size": 4970424,
"upload_time": "2025-07-28T04:43:57",
"upload_time_iso_8601": "2025-07-28T04:43:57.523207Z",
"url": "https://files.pythonhosted.org/packages/b6/51/96bc30e1d47ef900b717d5baeec9746733d183b08504dbfca470d23a5dd8/pex-2.48.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-28 04:43:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pex-tool",
"github_project": "pex",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pex"
}