On Fri, Jun 11, 2010 at 9:11 AM, Stodge <[email protected]> wrote: > I'm writing an install script that resides in django_project/install > and one of things it does, is programmatically run syncdb. My current > code for this is correct if I do: > > cd .. > python > import os > os.environ["DJANGO_SETTINGS_MODULE"]="settings" > from django.core.management import call_command > call_command('syncdb', interactive=False) > > If I copy this code into my installer, or indeed do the same as above, > but inside the django_project/install directory it fails: > > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "/usr/lib/python2.6/site-packages/django/core/management/ > __init__.py", line 166, in call_command > return klass.execute(*args, **defaults) > File "/usr/lib/python2.6/site-packages/django/core/management/ > base.py", line 221, in execute > self.validate() > File "/usr/lib/python2.6/site-packages/django/core/management/ > base.py", line 249, in validate > num_errors = get_validation_errors(s, app) > File "/usr/lib/python2.6/site-packages/django/core/management/ > validation.py", line 28, in get_validation_errors > for (app_name, error) in get_app_errors().items(): > File "/usr/lib/python2.6/site-packages/django/db/models/loading.py", > line 145, in get_app_errors > self._populate() > File "/usr/lib/python2.6/site-packages/django/db/models/loading.py", > line 60, in _populate > self.load_app(app_name, True) > File "/usr/lib/python2.6/site-packages/django/db/models/loading.py", > line 82, in load_app > if not module_has_submodule(app_module, 'models'): > File "/usr/lib/python2.6/site-packages/django/utils/ > module_loading.py", line 14, in module_has_submodule > for entry in package.__path__: # No __path__, then not a package. > AttributeError: 'module' object has no attribute '__path__' > > I've tried adding the project's path to sys.path, but that doesn't > make a difference. Is there a way to do this from a sub-directory? >
You need to ensure the python path in effect when this code runs from your installer is correct. Based on the error, it does not appear to be. The error implies that something listed in INSTALLED_APPS is being found, but it is not a package. Apparently what is being found when you run the code from the shell is different from what is being found when you run the code in the installer, and the likely cause of the difference is a different Python path. The first item in your PYTHONPATH will be the current directory. Is there some .py file in your install directory that matches the name of an app you have listed in installed apps? That could lead to this problem, if your installer code is running with a current directory of your install directory. Note there is a ticket open on this error situation ( http://code.djangoproject.com/ticket/13603). In older versions of Django this oddity of having a non-package listed in INSTALLED_APPS was just ignored. In your case I doubt the "fix" of simply ignoring whatever app is causing the problem would likely not be helpful, since I'm guessing some tables your installer should create would not be created. However the error message could be more helpful. Karen -- http://tracey.org/kmt/ -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

