mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	[3.13] gh-121245: Refactor site.register_readline() (GH-121659) (GH-121816)
(cherry picked from commit 05d413764c)
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
			
			
This commit is contained in:
		
							parent
							
								
									2ee2bfe617
								
							
						
					
					
						commit
						b506de4eb5
					
				
					 3 changed files with 36 additions and 36 deletions
				
			
		|  | @ -1,16 +1,32 @@ | |||
| import errno | ||||
| import os | ||||
| import sys | ||||
| 
 | ||||
| 
 | ||||
| CAN_USE_PYREPL: bool | ||||
| if sys.platform != "win32": | ||||
|     CAN_USE_PYREPL = True | ||||
| 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 = sys.getwindowsversion().build >= 10586  # Windows 10 TH2 | ||||
|     CAN_USE_PYREPL = True | ||||
|     FAIL_REASON = "" | ||||
| 
 | ||||
| 
 | ||||
| def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | ||||
|     global CAN_USE_PYREPL | ||||
|     if not CAN_USE_PYREPL: | ||||
|         if not os.environ.get('PYTHON_BASIC_REPL', None) and FAIL_REASON: | ||||
|             from .trace import trace | ||||
|             trace(FAIL_REASON) | ||||
|             print(FAIL_REASON, file=sys.stderr) | ||||
|         return sys._baserepl() | ||||
| 
 | ||||
|     if mainmodule: | ||||
|  | @ -20,6 +36,7 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | |||
|         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 | ||||
|  | @ -34,22 +51,5 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | |||
|     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() | ||||
|     run_interactive(namespace) | ||||
|     from .simple_interact import run_multiline_interactive_console | ||||
|     run_multiline_interactive_console(namespace) | ||||
|  |  | |||
							
								
								
									
										23
									
								
								Lib/site.py
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								Lib/site.py
									
										
									
									
									
								
							|  | @ -517,6 +517,10 @@ def register_readline(): | |||
|         pass | ||||
| 
 | ||||
|     if readline.get_current_history_length() == 0: | ||||
|         try: | ||||
|             from _pyrepl.main import CAN_USE_PYREPL | ||||
|         except ImportError: | ||||
|             CAN_USE_PYREPL = False | ||||
|         # If no history was loaded, default to .python_history, | ||||
|         # or PYTHON_HISTORY. | ||||
|         # The guard is necessary to avoid doubling history size at | ||||
|  | @ -524,25 +528,18 @@ def register_readline(): | |||
|         # through a PYTHONSTARTUP hook, see: | ||||
|         # http://bugs.python.org/issue5845#msg198636 | ||||
|         history = gethistoryfile() | ||||
|         if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL: | ||||
|             readline_module = readline | ||||
|         else: | ||||
|             readline_module = _pyrepl.readline | ||||
|         try: | ||||
|             if os.getenv("PYTHON_BASIC_REPL"): | ||||
|                 readline.read_history_file(history) | ||||
|             else: | ||||
|                 _pyrepl.readline.read_history_file(history) | ||||
|             readline_module.read_history_file(history) | ||||
|         except (OSError,* _pyrepl.unix_console._error): | ||||
|             pass | ||||
| 
 | ||||
|         def write_history(): | ||||
|             try: | ||||
|                 from _pyrepl.main import CAN_USE_PYREPL | ||||
|             except ImportError: | ||||
|                 CAN_USE_PYREPL = False | ||||
| 
 | ||||
|             try: | ||||
|                 if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL: | ||||
|                     readline.write_history_file(history) | ||||
|                 else: | ||||
|                     _pyrepl.readline.write_history_file(history) | ||||
|                 readline_module.write_history_file(history) | ||||
|             except (FileNotFoundError, PermissionError): | ||||
|                 # home directory does not exist or is not writable | ||||
|                 # https://bugs.python.org/issue19891 | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| Simplify handling of the history file in ``site.register_readline()`` | ||||
| helper. The ``CAN_USE_PYREPL`` variable now will be initialized, when | ||||
| imported.  Patch by Sergey B Kirpichev. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)