Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#32783 closed Bug (fixed)

Auoreloader crashes in a conda env.

Reported by: JonathanNickelson Owned by: Mariusz Felisiak
Component: Core (Management commands) Version: 3.2
Severity: Release blocker Keywords:
Cc: William Schwartz Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The changes in this commit https://github.com/django/django/commit/ec6d2531c59466924b645f314ac33f54470d7ac3 to def get_child_arguments() of django/utils/autoreload.py cause a crash when running manage.py as a script from a conda env. For example:

miniconda3/envs/promotion_tool_38/bin/manage.py runserver 10.12.123.45:8183 no longer works and gives this stacktrace:

Traceback (most recent call last):
  File "miniconda3/envs/promotion_tool_38/bin/manage.py", line 4, in <module>
    __import__('pkg_resources').run_script('promotion-tool==1.0.28', 'manage.py')
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 651, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1448, in run_script
    exec(code, namespace, namespace)
  File "/site/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/promotion_tool-1.0.28-py3.7.egg/EGG-INFO/scripts/manage.py", line 21, in <module>
    main()
  File "/site/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/promotion_tool-1.0.28-py3.7.egg/EGG-INFO/scripts/manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 61, in execute
    super().execute(*args, **options)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 96, in handle
    self.run(**options)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 103, in run
    autoreload.run_with_reloader(self.inner_run, **options)
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/utils/autoreload.py", line 639, in run_with_reloader
    exit_code = restart_with_reloader()
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/utils/autoreload.py", line 256, in restart_with_reloader
    args = get_child_arguments()
  File "/home/srv_jaxqa/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/django/utils/autoreload.py", line 225, in get_child_arguments
    if __main__.__spec__ is not None and __main__.__spec__.parent:
AttributeError: module '__main__' has no attribute '__spec__'

The work around for this is to explicitly call the actual manage.py inside the EGG-INFO like this:

~/miniconda3/envs/promotion_tool_38/lib/python3.8/site-packages/promotion_tool-1.0.28-py3.7.egg/EGG-INFO/scripts/manage.py runserver 10.12.123.45:8183

After reverting the changes locally found in this method "get_child_arguments" in django/utils/autoreload.py in the commit above, the command miniconda3/envs/promotion_tool_38/bin/manage.py runserver 10.12.123.45:8183 works again, or if inside the conda env then just manage.py runserver 10.12.123.45:8183 works.

Change History (6)

comment:1 by Mariusz Felisiak, 3 years ago

Cc: William Schwartz added
Easy pickings: unset

comment:2 by Mariusz Felisiak, 3 years ago

Component: UtilitiesCore (Management commands)
Owner: changed from nobody to Mariusz Felisiak
Severity: NormalRelease blocker
Status: newassigned
Summary: Recent commit causes issues when running manage.py as a script in a conda env. Django 3.2.3Auoreloader crashes in a conda env.
Triage Stage: UnreviewedAccepted

It looks like an issue in Python (see e.g. bop-42949), as far as I'm aware __main__ should always have __spec__ attribute (sometimes set to None but still). Nevertheless we can fix it.

Regression in ec6d2531c59466924b645f314ac33f54470d7ac3.

comment:3 by Mariusz Felisiak, 3 years ago

Has patch: set

comment:4 by GitHub <noreply@…>, 3 years ago

Resolution: fixed
Status: assignedclosed

In 12b19a1:

Fixed #32783 -- Fixed crash of autoreloader when main module doesn't have spec attribute.

Regression in ec6d2531c59466924b645f314ac33f54470d7ac3.

Thanks JonathanNickelson for the report.

comment:5 by Mariusz Felisiak <felisiak.mariusz@…>, 3 years ago

In 246a31a:

[3.2.x] Fixed #32783 -- Fixed crash of autoreloader when main module doesn't have spec attribute.

Regression in ec6d2531c59466924b645f314ac33f54470d7ac3.

Thanks JonathanNickelson for the report.
Backport of 12b19a1d76e1a6f80923c8358290d605dacd65d4 from main

comment:6 by Daniel Hahler, 3 years ago

Just for reference: the crash also happened with python -m pdb ./manage.py runserver.

Note: See TracTickets for help on using tickets.
Back to Top