1
0
mirror of https://github.com/django/django.git synced 2025-10-09 23:09:12 +00:00

[6.0.x] Fixed #36434 -- Preserved unbuffered stdio (-u) in autoreloader child.

Signed-off-by: SaJH <wogur981208@gmail.com>

Backport of 68aae8878ff90dd787db55ecc44ee712525ccdc6 from main.
This commit is contained in:
SaJH 2025-09-24 00:11:31 +09:00 committed by Sarah Boyce
parent 315e7def3c
commit db2f206ee1
2 changed files with 60 additions and 0 deletions

View File

@ -268,6 +268,19 @@ def trigger_reload(filename):
def restart_with_reloader(): def restart_with_reloader():
new_environ = {**os.environ, DJANGO_AUTORELOAD_ENV: "true"} new_environ = {**os.environ, DJANGO_AUTORELOAD_ENV: "true"}
orig = getattr(sys, "orig_argv", ())
if any(
(arg == "-u")
or (
arg.startswith("-")
and not arg.startswith(("--", "-X", "-W"))
and len(arg) > 2
and arg[1:].isalpha()
and "u" in arg
)
for arg in orig[1:]
):
new_environ.setdefault("PYTHONUNBUFFERED", "1")
args = get_child_arguments() args = get_child_arguments()
while True: while True:
p = subprocess.run(args, env=new_environ, close_fds=False) p = subprocess.run(args, env=new_environ, close_fds=False)

View File

@ -535,6 +535,53 @@ class RestartWithReloaderTests(SimpleTestCase):
[self.executable, "-Wall", "-m", "django"] + argv[1:], [self.executable, "-Wall", "-m", "django"] + argv[1:],
) )
def test_propagates_unbuffered_from_parent(self):
for args in ("-u", "-Iuv"):
with self.subTest(args=args):
with mock.patch.dict(os.environ, {}, clear=True):
with tempfile.TemporaryDirectory() as d:
script = Path(d) / "manage.py"
script.touch()
mock_call = self.patch_autoreload([str(script), "runserver"])
with (
mock.patch("__main__.__spec__", None),
mock.patch.object(
autoreload.sys,
"orig_argv",
[self.executable, args, str(script), "runserver"],
),
):
autoreload.restart_with_reloader()
env = mock_call.call_args.kwargs["env"]
self.assertEqual(env.get("PYTHONUNBUFFERED"), "1")
def test_does_not_propagate_unbuffered_from_parent(self):
for args in (
"-Xdev",
"-Xfaulthandler",
"--user",
"-Wall",
"-Wdefault",
"-Wignore::UserWarning",
):
with self.subTest(args=args):
with mock.patch.dict(os.environ, {}, clear=True):
with tempfile.TemporaryDirectory() as d:
script = Path(d) / "manage.py"
script.touch()
mock_call = self.patch_autoreload([str(script), "runserver"])
with (
mock.patch("__main__.__spec__", None),
mock.patch.object(
autoreload.sys,
"orig_argv",
[self.executable, args, str(script), "runserver"],
),
):
autoreload.restart_with_reloader()
env = mock_call.call_args.kwargs["env"]
self.assertIsNone(env.get("PYTHONUNBUFFERED"))
class ReloaderTests(SimpleTestCase): class ReloaderTests(SimpleTestCase):
RELOADER_CLS = None RELOADER_CLS = None