mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +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 os | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| CAN_USE_PYREPL: bool | CAN_USE_PYREPL: bool | ||||||
| if sys.platform != "win32": | FAIL_REASON: str | ||||||
|     CAN_USE_PYREPL = True | 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: | 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): | def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | ||||||
|     global CAN_USE_PYREPL |  | ||||||
|     if not 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() |         return sys._baserepl() | ||||||
| 
 | 
 | ||||||
|     if mainmodule: |     if mainmodule: | ||||||
|  | @ -20,6 +36,7 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | ||||||
|         namespace = __main__.__dict__ |         namespace = __main__.__dict__ | ||||||
|         namespace.pop("__pyrepl_interactive_console", None) |         namespace.pop("__pyrepl_interactive_console", None) | ||||||
| 
 | 
 | ||||||
|  |     # sys._baserepl() above does this internally, we do it here | ||||||
|     startup_path = os.getenv("PYTHONSTARTUP") |     startup_path = os.getenv("PYTHONSTARTUP") | ||||||
|     if pythonstartup and startup_path: |     if pythonstartup and startup_path: | ||||||
|         import tokenize |         import tokenize | ||||||
|  | @ -34,22 +51,5 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False): | ||||||
|     if not hasattr(sys, "ps2"): |     if not hasattr(sys, "ps2"): | ||||||
|         sys.ps2 = "... " |         sys.ps2 = "... " | ||||||
| 
 | 
 | ||||||
|     run_interactive = None |     from .simple_interact import run_multiline_interactive_console | ||||||
|     try: |     run_multiline_interactive_console(namespace) | ||||||
|         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) |  | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								Lib/site.py
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								Lib/site.py
									
										
									
									
									
								
							|  | @ -517,6 +517,10 @@ def register_readline(): | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|     if readline.get_current_history_length() == 0: |     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, |         # If no history was loaded, default to .python_history, | ||||||
|         # or PYTHON_HISTORY. |         # or PYTHON_HISTORY. | ||||||
|         # The guard is necessary to avoid doubling history size at |         # The guard is necessary to avoid doubling history size at | ||||||
|  | @ -524,25 +528,18 @@ def register_readline(): | ||||||
|         # through a PYTHONSTARTUP hook, see: |         # through a PYTHONSTARTUP hook, see: | ||||||
|         # http://bugs.python.org/issue5845#msg198636 |         # http://bugs.python.org/issue5845#msg198636 | ||||||
|         history = gethistoryfile() |         history = gethistoryfile() | ||||||
|  |         if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL: | ||||||
|  |             readline_module = readline | ||||||
|  |         else: | ||||||
|  |             readline_module = _pyrepl.readline | ||||||
|         try: |         try: | ||||||
|             if os.getenv("PYTHON_BASIC_REPL"): |             readline_module.read_history_file(history) | ||||||
|                 readline.read_history_file(history) |  | ||||||
|             else: |  | ||||||
|                 _pyrepl.readline.read_history_file(history) |  | ||||||
|         except (OSError,* _pyrepl.unix_console._error): |         except (OSError,* _pyrepl.unix_console._error): | ||||||
|             pass |             pass | ||||||
| 
 | 
 | ||||||
|         def write_history(): |         def write_history(): | ||||||
|             try: |             try: | ||||||
|                 from _pyrepl.main import CAN_USE_PYREPL |                 readline_module.write_history_file(history) | ||||||
|             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) |  | ||||||
|             except (FileNotFoundError, PermissionError): |             except (FileNotFoundError, PermissionError): | ||||||
|                 # home directory does not exist or is not writable |                 # home directory does not exist or is not writable | ||||||
|                 # https://bugs.python.org/issue19891 |                 # 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)