-
-
Notifications
You must be signed in to change notification settings - Fork 32.3k
gh-46927: Prevent readline from overriding environment #133585
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Most changes to Python require a NEWS entry. Add one using the blurb_it web app or the blurb command-line tool. If this change has little impact on Python users, wait for a maintainer to apply the |
Readline library will set the LINES and COLUMNS environment variables during initialization. One might expect these variables to be updated later on SIGWINCH, but this is not the case with cpython. As a consequence, when the readline module is imported, any process launched from cpython with the default environment will have LINES and COLUMNS variables set, potentially to a wrong value. Use the rl_change_environment global variable to disable this initial setup of the environment variables.
@@ -1323,6 +1323,13 @@ setup_readline(readlinestate *mod_state) | |||
/* The name must be defined before initialization */ | |||
rl_readline_name = "python"; | |||
|
|||
#if !defined(__APPLE__) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a bit surprised I had to rely on the __APPLE__
define here. As I understand apple OS is using libedit, so I would have thought relying on WITH_EDITLINE
would be enough. But the macOS pipeline proved me wrong...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add a test case. The file you're looking for is test_readline.
Misc/NEWS.d/next/Core_and_Builtins/2025-05-07-18-31-31.gh-issue-46927.sF02gj.rst
Outdated
Show resolved
Hide resolved
@@ -405,6 +407,12 @@ def test_write_read_limited_history(self): | |||
# So, we've only tested that the read did not fail. | |||
# See TestHistoryManipulation for the full test. | |||
|
|||
@requires_subprocess() | |||
def test_environment_is_not_modified(self): | |||
original_env = dict(os.environ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you forget to add the use of subprocess
here? This test always passes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Err sorry, I reworked the test and forgot to remove the subprocess requirement.
But I do confirm this test fails if I revert the initial commit of the PR.
Hi! Any news about this PR? Is there anything I can do to help the this modification being accepted? |
Readline library will set the LINES and COLUMNS environment variables during initialization. One might expect these variables to be updated later on SIGWINCH, but this is not the case with cpython.
As a consequence, when the readline module is imported, any process launched from cpython with the default environment will have LINES and COLUMNS variables set, potentially to a wrong value.
Use the rl_change_environment global variable to disable this initial setup of the environment variables.