| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  | import errno | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  | CAN_USE_PYREPL: bool | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  | 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}" | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  | else: | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  |     CAN_USE_PYREPL = True | 
					
						
							|  |  |  |     FAIL_REASON = "" | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | 
					
						
							|  |  |  |     if not CAN_USE_PYREPL: | 
					
						
							| 
									
										
										
										
											2024-07-16 00:49:41 +02:00
										 |  |  |         if not os.getenv('PYTHON_BASIC_REPL') and FAIL_REASON: | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  |             from .trace import trace | 
					
						
							|  |  |  |             trace(FAIL_REASON) | 
					
						
							|  |  |  |             print(FAIL_REASON, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  |         return sys._baserepl() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if mainmodule: | 
					
						
							|  |  |  |         namespace = mainmodule.__dict__ | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         import __main__ | 
					
						
							|  |  |  |         namespace = __main__.__dict__ | 
					
						
							|  |  |  |         namespace.pop("__pyrepl_interactive_console", None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  |     # sys._baserepl() above does this internally, we do it here | 
					
						
							| 
									
										
										
										
											2024-06-26 21:25:38 +02:00
										 |  |  |     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 = "... " | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-16 00:49:41 +02:00
										 |  |  |     from .console import InteractiveColoredConsole | 
					
						
							| 
									
										
										
										
											2024-07-15 22:49:18 +02:00
										 |  |  |     from .simple_interact import run_multiline_interactive_console | 
					
						
							| 
									
										
										
										
											2024-07-16 00:49:41 +02:00
										 |  |  |     console = InteractiveColoredConsole(namespace, filename="<stdin>") | 
					
						
							|  |  |  |     run_multiline_interactive_console(console) |