summaryrefslogtreecommitdiffstats
path: root/Lib/_pyrepl/__main__.py
blob: dae4ba6e178b9a6aa4cccd11ef262d4aa479c39f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import os
import sys

CAN_USE_PYREPL: bool
if sys.platform != "win32":
    CAN_USE_PYREPL = True
else:
    CAN_USE_PYREPL = sys.getwindowsversion().build >= 10586  # Windows 10 TH2


def interactive_console(mainmodule=None, quiet=False, pythonstartup=False):
    global CAN_USE_PYREPL
    if not CAN_USE_PYREPL:
        return sys._baserepl()

    startup_path = os.getenv("PYTHONSTARTUP")
    if pythonstartup and startup_path:
        import tokenize
        with tokenize.open(startup_path) as f:
            startup_code = compile(f.read(), startup_path, "exec")
            exec(startup_code)

    # set sys.{ps1,ps2} just before invoking the interactive interpreter. This
    # mimics what CPython does in pythonrun.c
    if not hasattr(sys, "ps1"):
        sys.ps1 = ">>> "
    if not hasattr(sys, "ps2"):
        sys.ps2 = "... "

    run_interactive = None
    try:
        import errno
        if not os.isatty(sys.stdin.fileno()):
            raise OSError(errno.ENOTTY, "tty required", "stdin")
        from .simple_interact import check
        if err := check():
            raise RuntimeError(err)
        from .simple_interact import run_multiline_interactive_console
        run_interactive = run_multiline_interactive_console
    except Exception as e:
        from .trace import trace
        msg = f"warning: can't use pyrepl: {e}"
        trace(msg)
        print(msg, file=sys.stderr)
        CAN_USE_PYREPL = False
    if run_interactive is None:
        return sys._baserepl()
    return run_interactive(mainmodule)

if __name__ == "__main__":
    interactive_console()