Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/pex.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions py/private/py_pex_binary.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ def _py_python_pex_impl(ctx):
args.add(ctx.attr.python_shebang, format = "--python-shebang=%s")
args.add(py_toolchain.python, format = "--python=%s")

if ctx.attr.inherit_path != "":
args.add(ctx.attr.inherit_path, format = "--inherit-path=%s")

py_version = py_toolchain.interpreter_version_info
args.add_all(
[
Expand Down Expand Up @@ -135,6 +138,15 @@ _attrs = dict({
doc = "Environment variables to set when running the pex binary.",
default = {},
),
"inherit_path": attr.string(
doc = """\
Whether to inherit the `sys.path` (aka PYTHONPATH) of the environment that the binary runs in.

Use `false` to not inherit `sys.path`; use `fallback` to inherit `sys.path` after packaged
dependencies; and use `prefer` to inherit `sys.path` before packaged dependencies.
""",
values = ["false", "fallback", "prefer"],
),
"python_shebang": attr.string(default = "#!/usr/bin/env python3"),
"python_interpreter_constraints": attr.string_list(
default = ["CPython=={major}.{minor}.*"],
Expand Down
17 changes: 17 additions & 0 deletions py/tools/pex/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import sys
from pex.pex_builder import Check,PEXBuilder
from pex.inherit_path import InheritPath
from pex.interpreter import PythonInterpreter
from pex.interpreter_constraints import InterpreterConstraint
from pex.layout import Layout
Expand All @@ -26,6 +27,13 @@ def __call__(self, parser, namespace, value, option_str=None):
)
self.default.append(tuple(components))


class InheritPathAction(Action):
def __call__(self, parser, namespace, value, option_str=None):
value = InheritPath.for_value(value)
setattr(namespace, self.dest, value)


parser = ArgumentParser(fromfile_prefix_chars='@')

parser.add_argument(
Expand Down Expand Up @@ -107,6 +115,13 @@ def __call__(self, parser, namespace, value, option_str=None):
action="append",
)

parser.add_argument(
"--inherit-path",
dest="inherit_path",
default=None,
action=InheritPathAction,
)

options = parser.parse_args(args = sys.argv[1:])

# Monkey patch bootstrap template to inject some templated environment variables.
Expand Down Expand Up @@ -157,6 +172,8 @@ def __call__(self, parser, namespace, value, option_str=None):
InterpreterConstraint.parse(constraint)
for constraint in options.constraints
]
if options.inherit_path is not None:
pex_info.inherit_path = options.inherit_path

for dep in options.dependencies:
dist = Distribution.load(dep)
Expand Down
Loading