***
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.16,>=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/6a/24/be2ed52bd5cb20422d1aa6e8e46ae0cc8c1b01752a4eeef9f2ed09d47f76/pex-2.68.1.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.68.1",
"project_urls": {
"Changelog": "https://github.com/pex-tool/pex/blob/v2.68.1/CHANGES.md",
"Documentation": "https://docs.pex-tool.org/",
"Download": "https://github.com/pex-tool/pex/releases/download/v2.68.1/pex",
"Homepage": "https://github.com/pex-tool/pex",
"Source": "https://github.com/pex-tool/pex/tree/v2.68.1"
},
"split_keywords": [
"package",
" executable",
" virtualenv",
" lock",
" freeze"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "56942424728ead89caac2be9ef675f081bd00cc341d62fc7a2b00855f496053d",
"md5": "78140ffc367e265900b4c7491156c3ff",
"sha256": "62b7f4a9ceb050319365e4bd0a9b3e5c661c14d8066b697d821cb63ca90e1b7f"
},
"downloads": -1,
"filename": "pex-2.68.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "78140ffc367e265900b4c7491156c3ff",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.16,>=2.7",
"size": 3933890,
"upload_time": "2025-11-03T20:49:21",
"upload_time_iso_8601": "2025-11-03T20:49:21.446988Z",
"url": "https://files.pythonhosted.org/packages/56/94/2424728ead89caac2be9ef675f081bd00cc341d62fc7a2b00855f496053d/pex-2.68.1-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6a24be2ed52bd5cb20422d1aa6e8e46ae0cc8c1b01752a4eeef9f2ed09d47f76",
"md5": "057037350d88aaef1e9f0298e925152b",
"sha256": "97460167f0dd166bd09c9da2815b7a22e195fb0c3f1b09c460314e990a856ea6"
},
"downloads": -1,
"filename": "pex-2.68.1.tar.gz",
"has_sig": false,
"md5_digest": "057037350d88aaef1e9f0298e925152b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,<3.16,>=2.7",
"size": 5206885,
"upload_time": "2025-11-03T20:49:23",
"upload_time_iso_8601": "2025-11-03T20:49:23.848837Z",
"url": "https://files.pythonhosted.org/packages/6a/24/be2ed52bd5cb20422d1aa6e8e46ae0cc8c1b01752a4eeef9f2ed09d47f76/pex-2.68.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-03 20:49:23",
"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"
}