id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 32183,shell command crashes when passing (with -c) the python code with functions.,William Schwartz,William Schwartz,"The examples below use Python 3.7 and Django 2.2.16, but I checked that the code is the same on master and works the same in Python 3.8. Here's how [https://docs.python.org/3/using/cmdline.html#cmdoption-c python -c] works: {{{ $ python -c < management.execute_from_command_line() File ""{sys.prefix}/lib/python3.7/site-packages/django/core/management/__init__.py"", line 381, in execute_from_command_line utility.execute() File ""{sys.prefix}/lib/python3.7/site-packages/django/core/management/__init__.py"", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File ""{sys.prefix}/lib/python3.7/site-packages/django/core/management/base.py"", line 323, in run_from_argv self.execute(*args, **cmd_options) File ""{sys.prefix}/lib/python3.7/site-packages/django/core/management/base.py"", line 364, in execute output = self.handle(*args, **options) File ""{sys.prefix}/lib/python3.7/site-packages/django/core/management/commands/shell.py"", line 86, in handle exec(options['command']) File """", line 5, in File """", line 4, in f NameError: name 'django' is not defined }}} The problem is in the [https://github.com/django/django/blob/dbb4a86fa7c15fb9cf73a5954356eb88d65ac25f/django/core/management/commands/shell.py#L84-L94 usage] of [https://docs.python.org/3/library/functions.html#exec exec]: {{{ #!python def handle(self, **options): # Execute the command and exit. if options['command']: exec(options['command']) return # Execute stdin if it has anything to read and exit. # Not supported on Windows due to select.select() limitations. if sys.platform != 'win32' and not sys.stdin.isatty() and select.select([sys.stdin], [], [], 0)[0]: exec(sys.stdin.read()) return }}} `exec` should be passed a dictionary containing a minimal set of globals. This can be done by just passing a new, empty dictionary as the second argument of `exec`. ",Bug,closed,Core (Management commands),dev,Normal,fixed,,,Ready for checkin,1,0,0,0,1,0