Skip to content

Instantly share code, notes, and snippets.

@dbl0null
Forked from dlamotte/pex-build.py
Created November 30, 2017 10:10
Show Gist options
  • Save dbl0null/af558f6f6403e8fc36cabbc858761065 to your computer and use it in GitHub Desktop.
Save dbl0null/af558f6f6403e8fc36cabbc858761065 to your computer and use it in GitHub Desktop.
Using pex to build a single python executable (minimal requirements)
#!/usr/bin/env python2.7
from pex.pex_builder import PEXBuilder
from pex.resolvable import resolvables_from_iterable
from pex.resolver import CachingResolver
from pex.resolver_options import ResolverOptionsBuilder
import argparse
import os
import shutil
import sys
import tempfile
def main():
args = parse()
tmpdir = tempfile.mkdtemp()
try:
pex = PEXBuilder(path=tmpdir)
if args.requirement:
resolver = CachingResolver('.pex-cache', None)
resolveds = resolver.resolve(resolvables_from_iterable(
args.requirement,
ResolverOptionsBuilder()
))
for dist in resolveds:
pex.add_distribution(dist)
pex.add_requirement(dist.as_requirement())
for input in args.input:
pex.add_source(
input,
os.path.join(pex.BOOTSTRAP_DIR, input)
)
pex.set_entry_point(args.entrypoint)
if args.shebang:
pex.set_shebang(args.shebang)
pex.build(args.output)
finally:
shutil.rmtree(tmpdir, True)
return 0
def parse():
parser = argparse.ArgumentParser()
parser.add_argument('output',
help='the destination of the output pex'
)
parser.add_argument('entrypoint',
help='module[:symbol] to use as entrypoint',
)
parser.add_argument('input',
help='a list of python files to package in',
metavar='input.py',
nargs='+',
)
parser.add_argument('--shebang',
help='set shebang for the output pex'
)
parser.add_argument('--requirement',
action='append',
help='add requirements to this pex'
)
return parser.parse_args()
if __name__ == '__main__':
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment