• Stars
    star
    2,414
  • Rank 19,056 (Top 0.4 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created over 10 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A tool for generating .pex (Python EXecutable) files, lock files and venvs.

PEX

https://github.com/pantsbuild/pex/workflows/CI/badge.svg?branch=main

Overview

pex is a library for generating .pex (Python EXecutable) files which are executable Python environments in the spirit of virtualenvs. pex is an expansion upon the ideas outlined in PEP 441 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, Buck, and {py}gradle also support building .pex files directly.

Still unsure about what pex does or how it works? Watch this quick lightning talk: WTF is PEX?.

pex is licensed under the Apache2 license.

Installation

To install pex, simply

$ pip install pex

You can also build pex in a git clone using tox:

$ tox -e 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:

$ pex requests flask 'psutil>2,<3'

Save Dependencies From Pip

Or instead freeze your current virtualenv via requirements.txt and execute it anywhere:

$ 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:

$ pex flask -- webserver.py

Launch Sphinx in an ephemeral pex environment using the Sphinx entry point sphinx:main:

$ 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:

$ 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:

$ 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.

Integrating pex into your workflow

If you use tox (and you should!), a simple way to integrate pex into your workflow is to add a packaging test environment to your tox.ini:

[testenv:package]
deps = pex
commands = pex . -o dist/app.pex

Then tox -e package will produce a relocatable copy of your application that you can copy to staging or production environments.

Documentation

More documentation about Pex, building .pex files, and how .pex files work is available at https://pex.readthedocs.io.

Development

Pex uses tox for test and development automation. To run the test suite, just invoke tox:

$ tox

If you don't have tox, you can generate a pex of tox:

$ pex tox -c tox -o ~/bin/tox

Tox provides many useful commands and options, explained at https://tox.wiki/en/latest/ . Below, we provide some of the most commonly used commands used when working on Pex, but the docs are worth acquainting yourself with to better understand how Tox works and how to do more advanced commands.

To run a specific environment, identify the name of the environment you'd like to invoke by running tox --listenvs-all, then invoke like this:

$ tox -e format-run

To run MyPy:

$ tox -e typecheck

All of our tox test environments allow passthrough arguments, which can be helpful to run specific tests:

$ tox -e py37-integration -- -k test_reproducible_build

To run Pex from source, rather than through what is on your PATH, invoke via Python:

$ python -m pex

Contributing

To contribute, follow these instructions: https://www.pantsbuild.org/docs/contributor-overview

More Repositories

1

pants

The Pants Build System
Python
3,306
star
2

example-python

An example repo to demonstrate Python support in Pants
Shell
85
star
3

intellij-pants-plugin

IntelliJ Plug-in for Pants Build
Java
74
star
4

lambdex

lambdex turns pex files into aws lambda functions
Python
55
star
5

jarjar

An export of https://code.google.com/p/jarjar/ @ svn:r142 for pants tool use and further development.
Java
37
star
6

example-django

An example repo to demonstrate Django support in Pants
Python
27
star
7

scie-pants

Protects your Pants from the elements.
Rust
19
star
8

example-docker

An example repository to demonstrate Docker support in Pants
Shell
14
star
9

binaries

A temporary home for pants static binaries and scripts
Perl
14
star
10

setup

Scripts for setting up Pants in your repo
Shell
12
star
11

pants-jupyter-plugin

Python
12
star
12

pantsbuild.github.io

Pants Build v1 Documentation (no longer updated, see https://www.pantsbuild.org for v2 documentation)
HTML
11
star
13

vim-pants

Vim plugin for Pants
Vim Script
6
star
14

example-golang

An example repo to demonstrate Go support in Pants
Shell
5
star
15

jmake

A repo to track modifications of jmake used by pants but not yet merged upstream
Java
5
star
16

actions

Useful GitHub Actions that work with the Pants build system
Python
5
star
17

example-adhoc

Example uses of the Pants adhoc command functionality
Shell
3
star
18

example-codegen

An example repository to demonstrate codegen support in Pants
Shell
3
star
19

example-jvm

An example repo to demonstrate Java and Scala support in Pants
Shell
3
star
20

homebrew-tap

A custom tap for Pantsbuild software.
Ruby
3
star
21

maven-repo

A temporary home to manange a maven repo we publish to bintray
Shell
3
star
22

indexed-classloader

A custom JVM classloader that indexes classpath elements for much faster class/resource location.
Java
2
star
23

example-plugin

2
star
24

example-kotlin

An example repo to demonstrate Kotlin support in Pants
Shell
2
star
25

user-registration

Temporary repo for playing around with issue templates/forms
1
star
26

pantsbuild.org

The Pants website
MDX
1
star
27

requirements-perf

Demonstrate Python requirements performance challenges
Starlark
1
star
28

example-javascript

An example repo to demonstrate JavaScript support in Pants
Shell
1
star
29

ivy

A repo to track modifications of ivy used by pants but not yet merged upstream
Java
1
star
30

example-serverless

An example repo to demonstrate cloud function support in Pants
1
star
31

flake8-pantsbuild

A flake8 plugin for pantsbuild custom lints.
Python
1
star
32

logo

A repo to prove the provenance and license of the Pants logo
1
star
33

example-visibility

Example repo demonstrating the Pants code visibility rules
Python
1
star