mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import errno
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| 
 | |
| CAN_USE_PYREPL: bool
 | |
| FAIL_REASON: str
 | |
| try:
 | |
|     if sys.platform == "win32" and sys.getwindowsversion().build < 10586:
 | |
|         raise RuntimeError("Windows 10 TH2 or later required")
 | |
|     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)
 | |
| except Exception as e:
 | |
|     CAN_USE_PYREPL = False
 | |
|     FAIL_REASON = f"warning: can't use pyrepl: {e}"
 | |
| else:
 | |
|     CAN_USE_PYREPL = True
 | |
|     FAIL_REASON = ""
 | |
| 
 | |
| 
 | |
| def interactive_console(mainmodule=None, quiet=False, pythonstartup=False):
 | |
|     if not CAN_USE_PYREPL:
 | |
|         if not os.getenv('PYTHON_BASIC_REPL') and FAIL_REASON:
 | |
|             from .trace import trace
 | |
|             trace(FAIL_REASON)
 | |
|             print(FAIL_REASON, file=sys.stderr)
 | |
|         return sys._baserepl()
 | |
| 
 | |
|     if mainmodule:
 | |
|         namespace = mainmodule.__dict__
 | |
|     else:
 | |
|         import __main__
 | |
|         namespace = __main__.__dict__
 | |
|         namespace.pop("__pyrepl_interactive_console", None)
 | |
| 
 | |
|     # sys._baserepl() above does this internally, we do it here
 | |
|     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, namespace)
 | |
| 
 | |
|     # 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 = "... "
 | |
| 
 | |
|     from .console import InteractiveColoredConsole
 | |
|     from .simple_interact import run_multiline_interactive_console
 | |
|     console = InteractiveColoredConsole(namespace, filename="<stdin>")
 | |
|     run_multiline_interactive_console(console)
 | 
