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:
parent
315e7def3c
commit
db2f206ee1
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user