From f19b93fce04fb0bc9b59071915a6aa6b01860d8a Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 6 Jan 2024 22:30:12 -0800 Subject: gh-73965: New environment variable PYTHON_HISTORY (#13208) It can be used to set the location of a .python_history file --------- Co-authored-by: Levi Sabah <0xl3vi@gmail.com> Co-authored-by: Hugo van Kemenade --- Doc/using/cmdline.rst | 8 ++++++++ Doc/whatsnew/3.13.rst | 5 +++++ Lib/site.py | 20 +++++++++++++++++--- Lib/test/test_site.py | 14 ++++++++++++++ .../Library/2019-05-08-13-14-11.bpo-29779.jg33dp.rst | 2 ++ Misc/python.man | 3 +++ Python/initconfig.c | 1 + 7 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-05-08-13-14-11.bpo-29779.jg33dp.rst diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index e032a19..0804e6a 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -1139,6 +1139,14 @@ conflict. .. versionadded:: 3.13 +.. envvar:: PYTHON_HISTORY + + This environment variable can be used to set the location of a + ``.python_history`` file (by default, it is ``.python_history`` in the + user's home directory). + + .. versionadded:: 3.13 + Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 3ab6d1d..59b9281 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -132,6 +132,11 @@ Other Language Changes equivalent of the :option:`-X frozen_modules <-X>` command-line option. (Contributed by Yilei Yang in :gh:`111374`.) +* The new :envvar:`PYTHON_HISTORY` environment variable can be used to change + the location of a ``.python_history`` file. + (Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade in + :gh:`73965`.) + New Modules =========== diff --git a/Lib/site.py b/Lib/site.py index 6f5738b..eea92df 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -433,6 +433,20 @@ def setcopyright(): def sethelper(): builtins.help = _sitebuiltins._Helper() + +def gethistoryfile(): + """Check if the PYTHON_HISTORY environment variable is set and define + it as the .python_history file. If PYTHON_HISTORY is not set, use the + default .python_history file. + """ + if not sys.flags.ignore_environment: + history = os.environ.get("PYTHON_HISTORY") + if history: + return history + return os.path.join(os.path.expanduser('~'), + '.python_history') + + def enablerlcompleter(): """Enable default readline configuration on interactive prompts, by registering a sys.__interactivehook__. @@ -467,13 +481,13 @@ def enablerlcompleter(): pass if readline.get_current_history_length() == 0: - # If no history was loaded, default to .python_history. + # If no history was loaded, default to .python_history, + # or PYTHON_HISTORY. # The guard is necessary to avoid doubling history size at # each interpreter exit when readline was already configured # through a PYTHONSTARTUP hook, see: # http://bugs.python.org/issue5845#msg198636 - history = os.path.join(os.path.expanduser('~'), - '.python_history') + history = gethistoryfile() try: readline.read_history_file(history) except OSError: diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 9f199d9..e26b48e 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -7,6 +7,7 @@ executing have not been removed. import unittest import test.support from test import support +from test.support.script_helper import assert_python_ok from test.support import os_helper from test.support import socket_helper from test.support import captured_stderr @@ -338,6 +339,19 @@ class HelperFunctionsTests(unittest.TestCase): mock_addsitedir.assert_not_called() self.assertFalse(known_paths) + def test_gethistoryfile(self): + filename = 'file' + rc, out, err = assert_python_ok('-c', + f'import site; assert site.gethistoryfile() == "{filename}"', + PYTHON_HISTORY=filename) + self.assertEqual(rc, 0) + + # Check that PYTHON_HISTORY is ignored in isolated mode. + rc, out, err = assert_python_ok('-I', '-c', + f'import site; assert site.gethistoryfile() != "{filename}"', + PYTHON_HISTORY=filename) + self.assertEqual(rc, 0) + def test_trace(self): message = "bla-bla-bla" for verbose, out in (True, message + "\n"), (False, ""): diff --git a/Misc/NEWS.d/next/Library/2019-05-08-13-14-11.bpo-29779.jg33dp.rst b/Misc/NEWS.d/next/Library/2019-05-08-13-14-11.bpo-29779.jg33dp.rst new file mode 100644 index 0000000..49d0ba9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-08-13-14-11.bpo-29779.jg33dp.rst @@ -0,0 +1,2 @@ +Add a new :envvar:`PYTHON_HISTORY` environment variable to set the location +of a ``.python_history`` file. diff --git a/Misc/python.man b/Misc/python.man index 14cbd85..0f5dfa2 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -604,6 +604,9 @@ can be set to the callable of your debugger of choice. .IP PYTHON_COLORS If this variable is set to 1, the interpreter will colorize various kinds of output. Setting it to 0 deactivates this behavior. +.IP PYTHON_HISTORY +This environment variable can be used to set the location of a history file +(on Unix, it is \fI~/.python_history\fP by default). .SS Debug-mode variables Setting these variables only has an effect in a debug build of Python, that is, if Python was configured with the diff --git a/Python/initconfig.c b/Python/initconfig.c index 06e3179..aad3b3d 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -296,6 +296,7 @@ static const char usage_envvars[] = "PYTHON_COLORS : If this variable is set to 1, the interpreter will" " colorize various kinds of output. Setting it to 0 deactivates this behavior.\n" "These variables have equivalent command-line parameters (see --help for details):\n" +"PYTHON_HISTORY: the location of a .python_history file.\n" "PYTHONDEBUG : enable parser debug mode (-d)\n" "PYTHONDONTWRITEBYTECODE : don't write .pyc files (-B)\n" "PYTHONINSPECT : inspect interactively after running script (-i)\n" -- cgit v0.12