From 9e4780dedac15adcc04309d0198f4ae34e04cc2a Mon Sep 17 00:00:00 2001 From: Moriyoshi Koizumi Date: Sun, 25 Apr 2021 11:52:18 +0900 Subject: [PATCH] Fixed #32669 -- Fixed detection when started non-django modules which aren't packages with "python -m" in autoreloader. --- django/utils/autoreload.py | 9 +++++++-- tests/utils_tests/test_autoreload.py | 11 ++++++++++- tests/utils_tests/test_module/main_module.py | 0 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 tests/utils_tests/test_module/main_module.py diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py index b6af5f5491..15df088c48 100644 --- a/django/utils/autoreload.py +++ b/django/utils/autoreload.py @@ -223,8 +223,13 @@ def get_child_arguments(): # __spec__ is set when the server was started with the `-m` option, # see https://docs.python.org/3/reference/import.html#main-spec # __spec__ may not exist, e.g. when running in a Conda env. - if getattr(__main__, '__spec__', None) is not None and __main__.__spec__.parent: - args += ['-m', __main__.__spec__.parent] + if getattr(__main__, '__spec__', None) is not None: + spec = __main__.__spec__ + if (spec.name == '__main__' or spec.name.endswith('.__main__')) and spec.parent: + name = spec.parent + else: + name = spec.name + args += ['-m', name] args += sys.argv[1:] elif not py_script.exists(): # sys.argv[0] may not exist for several reasons on Windows. diff --git a/tests/utils_tests/test_autoreload.py b/tests/utils_tests/test_autoreload.py index 7b91686bf5..af439d8b18 100644 --- a/tests/utils_tests/test_autoreload.py +++ b/tests/utils_tests/test_autoreload.py @@ -23,7 +23,7 @@ from django.test.utils import extend_sys_path from django.utils import autoreload from django.utils.autoreload import WatchmanUnavailable -from .test_module import __main__ as test_main +from .test_module import __main__ as test_main, main_module as test_main_module from .utils import on_macos_with_hfs @@ -182,6 +182,15 @@ class TestChildArguments(SimpleTestCase): [sys.executable, '-m', 'utils_tests.test_module', 'runserver'], ) + @mock.patch.dict(sys.modules, {'__main__': test_main_module}) + @mock.patch('sys.argv', [test_main.__file__, 'runserver']) + @mock.patch('sys.warnoptions', []) + def test_run_as_non_django_module_non_package(self): + self.assertEqual( + autoreload.get_child_arguments(), + [sys.executable, '-m', 'utils_tests.test_module.main_module', 'runserver'], + ) + @mock.patch('sys.argv', [__file__, 'runserver']) @mock.patch('sys.warnoptions', ['error']) def test_warnoptions(self): diff --git a/tests/utils_tests/test_module/main_module.py b/tests/utils_tests/test_module/main_module.py new file mode 100644 index 0000000000..e69de29bb2