#32202: django-admin runserver and get_child_arguments
-------------------------------------+-------------------------------------
               Reporter:  andrey-    |          Owner:  nobody
  zotov                              |
                   Type:  Bug        |         Status:  new
              Component:  Core       |        Version:  3.1
  (Management commands)              |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 "django-admin runserver" fails with the following error:

 {{{
 Traceback (most recent call last):
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\runpy.py",
 line 193, in _run_module_as_main
     "__main__", mod_spec)
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\runpy.py",
 line 85, in _run_code
     exec(code, run_globals)
   File "C:\Users\someone\AppData\Local\Programs\Python\Python37\Scripts
 \django-admin.exe\__main__.py", line 7, in <module>
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\__init__.py", line 401, in
 execute_from_command_line
     utility.execute()
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\__init__.py", line 395, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\base.py", line 330, in run_from_argv
     self.execute(*args, **cmd_options)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\commands\runserver.py", line 61, in
 execute
     super().execute(*args, **options)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\base.py", line 371, in execute
     output = self.handle(*args, **options)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\commands\runserver.py", line 96, in handle
     self.run(**options)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\core\management\commands\runserver.py", line 103, in run
     autoreload.run_with_reloader(self.inner_run, **options)
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\utils\autoreload.py", line 616, in run_with_reloader
     exit_code = restart_with_reloader()
   File "c:\users\someone\appdata\local\programs\python\python37\lib\site-
 packages\django\utils\autoreload.py", line 244, in restart_with_reloader
     p = subprocess.run(args, env=new_environ, close_fds=False)
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\subprocess.py",
 line 488, in run
     with Popen(*popenargs, **kwargs) as process:
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\subprocess.py",
 line 800, in __init__
     restore_signals, start_new_session)
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\subprocess.py",
 line 1148, in _execute_child
     args = list2cmdline(args)
   File
 "c:\users\someone\appdata\local\programs\python\python37\lib\subprocess.py",
 line 555, in list2cmdline
     needquote = (" " in arg) or ("\t" in arg) or not arg
 TypeError: argument of type 'WindowsPath' is not iterable
 }}}

 Environment:
 Windows 10
 Python: 3.7.6
 Django: 3.1.3

 Steps to reproduce:
 {{{
 django-admin startproject mysite
 set PYTHONPATH=<thelocaldir>
 django-admin runserver --settings=mysite.settings
 }}}

 Apparently django.utils.autoreload.get_child_arguments returns
 WindowsPath("C:\Users\someone\AppData\Local\Programs\Python\Python37\Scripts
 \django-admin.exe") as the first argument,
 and subprocess.Popen expects a string and is not able to use Path.

 The following monkey-patch fixes the error:
 {{{
 def get_child_arguments_override():
     args = autoreload._get_child_arguments()
     for i, arg in enumerate(args):
         if isinstance(arg, Path):
             args[i] = str(arg)
     return args

 autoreload._get_child_arguments = autoreload.get_child_arguments
 autoreload.get_child_arguments = get_child_arguments_override
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32202>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/055.fc69bbb51da7b5fb34d8c9e2e9ceea22%40djangoproject.com.

Reply via email to