summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoriyoshi Koizumi <mozo@mozo.jp>2021-04-25 11:52:18 +0900
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-05-26 12:29:43 +0200
commit9e4780dedac15adcc04309d0198f4ae34e04cc2a (patch)
treedea939b75ae188ca4f2f200969a2619e0c3297b1
parent5a8e8f80bb82a867eab7e4d9d099f21d0a976d22 (diff)
Fixed #32669 -- Fixed detection when started non-django modules which aren't packages with "python -m" in autoreloader.
-rw-r--r--django/utils/autoreload.py9
-rw-r--r--tests/utils_tests/test_autoreload.py11
-rw-r--r--tests/utils_tests/test_module/main_module.py0
3 files changed, 17 insertions, 3 deletions
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
--- /dev/null
+++ b/tests/utils_tests/test_module/main_module.py