Index: django/core/management/__init__.py
===================================================================
--- django/core/management/__init__.py	(revision 7361)
+++ django/core/management/__init__.py	(working copy)
@@ -52,7 +52,7 @@
     return getattr(__import__('%s.management.commands.%s' % (app_name, name),
                    {}, {}, ['Command']), 'Command')()
 
-def get_commands(load_user_commands=True, project_directory=None):
+def get_commands():
     """
     Returns a dictionary mapping command names to their callback applications.
 
@@ -80,15 +80,25 @@
     if _commands is None:
         _commands = dict([(name, 'django.core') for name in find_commands(__path__[0])])
 
-        if load_user_commands:
+        # Get commands from all installed apps.
+        try:
             # Get commands from all installed apps.
             from django.conf import settings
-            for app_name in settings.INSTALLED_APPS:
-                try:
-                    path = find_management_module(app_name)
-                    _commands.update(dict([(name, app_name) for name in find_commands(path)]))
-                except ImportError:
-                    pass # No management module -- ignore this app.
+            apps = settings.INSTALLED_APPS
+        except (AttributeError, EnvironmentError):
+            apps = []
+        try:
+            from django.conf import settings
+            project_directory = setup_environ(__import__(settings.SETTINGS_MODULE))
+        except (AttributeError, EnvironmentError, ImportError):
+            project_directory = None
+        for app_name in apps:
+            try:
+                path = find_management_module(app_name)
+                _commands.update(dict([(name, app_name)
+                                       for name in find_commands(path)]))
+            except ImportError:
+                pass # No management module - ignore this app
 
         if project_directory:
             # Remove the "startproject" command from self.commands, because
@@ -145,8 +155,6 @@
     def __init__(self, argv=None):
         self.argv = argv or sys.argv[:]
         self.prog_name = os.path.basename(self.argv[0])
-        self.project_directory = None
-        self.user_commands = False
 
     def main_help_text(self):
         """
@@ -156,7 +164,7 @@
         usage.append('Django command line tool, version %s' % django.get_version())
         usage.append("Type '%s help <subcommand>' for help on a specific subcommand." % self.prog_name)
         usage.append('Available subcommands:')
-        commands = get_commands(self.user_commands, self.project_directory).keys()
+        commands = get_commands().keys()
         commands.sort()
         for cmd in commands:
             usage.append('  %s' % cmd)
@@ -169,7 +177,7 @@
         "django-admin.py" or "manage.py") if it can't be found.
         """
         try:
-            app_name = get_commands(self.user_commands, self.project_directory)[subcommand]
+            app_name = get_commands()[subcommand]
             if isinstance(app_name, BaseCommand):
                 # If the command is already loaded, use it directly.
                 klass = app_name
@@ -229,8 +237,6 @@
     """
     def __init__(self, argv, project_directory):
         super(ProjectManagementUtility, self).__init__(argv)
-        self.project_directory = project_directory
-        self.user_commands = True
 
 def setup_environ(settings_mod):
     """
@@ -251,8 +257,9 @@
     project_module = __import__(project_name, {}, {}, [''])
     sys.path.pop()
 
-    # Set DJANGO_SETTINGS_MODULE appropriately.
-    os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name)
+    # Set DJANGO_SETTINGS_MODULE appropriately if it hasn't already been set.
+    if not os.environ.has_key('DJANGO_SETTINGS_MODULE'):
+        os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name)
     return project_directory
 
 def execute_from_command_line(argv=None):
