| import os |
| import runpy |
| import sys |
| from pathlib import Path |
| |
| from python.runfiles import runfiles |
| |
| # runfiles.py will reject paths which aren't normalized, which can happen when the REPL rules are |
| # used from a remote module. |
| STUB_PATH = os.path.normpath("%stub_path%") |
| |
| |
| def start_repl(): |
| if sys.stdin.isatty(): |
| # Print the banner similar to how python does it on startup when running interactively. |
| cprt = 'Type "help", "copyright", "credits" or "license" for more information.' |
| sys.stderr.write("Python %s on %s\n%s\n" % (sys.version, sys.platform, cprt)) |
| |
| # If there's a PYTHONSTARTUP script, we need to capture the new variables |
| # that it defines. |
| new_globals = {} |
| |
| # Simulate Python's behavior when a valid startup script is defined by the |
| # PYTHONSTARTUP variable. If this file path fails to load, print the error |
| # and revert to the default behavior. |
| # |
| # See upstream for more information: |
| # https://docs.python.org/3/using/cmdline.html#envvar-PYTHONSTARTUP |
| if startup_file := os.getenv("PYTHONSTARTUP"): |
| try: |
| source_code = Path(startup_file).read_text() |
| except Exception as error: |
| print(f"{type(error).__name__}: {error}") |
| else: |
| compiled_code = compile(source_code, filename=startup_file, mode="exec") |
| eval(compiled_code, new_globals) |
| |
| bazel_runfiles = runfiles.Create() |
| runpy.run_path( |
| bazel_runfiles.Rlocation(STUB_PATH), |
| init_globals=new_globals, |
| run_name="__main__", |
| ) |
| |
| |
| if __name__ == "__main__": |
| start_repl() |