Parent module not loaded error

2009-01-14 Thread Ståle Undheim
I have a pretty strange error that I can't figure out the cause off.
This is in a Django app.

I am using berkelydb, with secondary databases for indexing. The
secondary databases are associated with a callback that uses cPickle
to serialize index values. The problem is that cPickle.dumps(value)
fails when I run it through mod_wsgi or mod_python on the deployment
server (Ubuntu Linux 8.10), but works fine when when I use Djangos
runserver on the same computer. Also, on my own computer (Ubuntu Linux
8.10), it works fine through mod_python.

Each time I call on cPickle.dumps(value) I get:
SystemError(Parent module 'd4' not loaded,)

Using sys.exc_info() I get no type or traceback, just that exception.
The callstack as far as I can figure is:

django
view
bsddb.put
indexer callback
cPickle.dumps

cPickle.loads works fine within the callback, I can also use
cPickle.dumps() outside the indexer callback. But inside the callback,
I need to use normal pickle instead. I just want to know why. I am
assuming it has something to do with the fact that I go from python to
C (bsddb) back to python (indexer callback) and back to C (cPickle).
It is still strange then that cPickle.loads() work, but not
cPickle.dumps(). I am also only storing integer values when I get this
error, so no fancy list, dictionaries or objects.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Parent module not loaded error

2009-01-14 Thread Graham Dumpleton
On Jan 14, 9:20 pm, Ståle Undheim staa...@gmail.com wrote:
 I have a pretty strange error that I can't figure out the cause off.
 This is in a Django app.

 I am using berkelydb, with secondary databases for indexing. The
 secondary databases are associated with a callback that uses cPickle
 to serialize index values. The problem is that cPickle.dumps(value)
 fails when I run it throughmod_wsgior mod_python on the deployment
 server (Ubuntu Linux 8.10), but works fine when when I use Djangos
 runserver on the same computer. Also, on my own computer (Ubuntu Linux
 8.10), it works fine through mod_python.

 Each time I call on cPickle.dumps(value) I get:
 SystemError(Parent module 'd4' not loaded,)

 Using sys.exc_info() I get no type or traceback, just that exception.
 The callstack as far as I can figure is:

 django
 view
 bsddb.put
 indexer callback
 cPickle.dumps

 cPickle.loads works fine within the callback, I can also use
 cPickle.dumps() outside the indexer callback. But inside the callback,
 I need to use normal pickle instead. I just want to know why. I am
 assuming it has something to do with the fact that I go from python to
 C (bsddb) back to python (indexer callback) and back to C (cPickle).
 It is still strange then that cPickle.loads() work, but not
 cPickle.dumps(). I am also only storing integer values when I get this
 error, so no fancy list, dictionaries or objects.

Where is module 'd4'? Is that one of yours defined inside of your
Django project?

One of the problems with Django runserver is that the parent of the
site directory and the site directory are effectively starting points
for searching for modules, even though neither is explicitly listed in
sys.path. The parent is used because runserver does momentarily add
parent to sys.path to import site package root, after which it removes
directory from sys.path. The site directory itself is used because for
runserver that is the current working directory and imports look there
automatically.

End result is that modules inside of site can be imported either via
site package root, or direct. For example, if d4.py was at same level
as settings.py file and site was called mysite, you could import it as
mysite.d4 or just d4. This is bad because means you could end up with
two copies of a module imported under the different name references.

If they way the pickle was done in application was such that reference
was via d4, and then when you deployed to mod_python or mod_wsgi you
only added parent directory of site to Python path, then it will not
be able to find d4, since at that point would only be found as
mysite.d4.

If this is the case, add the site directory to Python path by setting
PythonPath for mod_python or sys.path in WSGI script file for
mod_wsgi. Better still, fix up your code so module references in code,
ie., urls.py, or anywhere else, are always done by site package root
reference and not direct. Ie., such that it uses mysite.d4 and not
just d4.

Would that seem about right?

Graham
--
http://mail.python.org/mailman/listinfo/python-list


Re: Parent module not loaded error

2009-01-14 Thread Ståle Undheim
On Jan 14, 11:31 am, Graham Dumpleton graham.dumple...@gmail.com
wrote:
 On Jan 14, 9:20 pm, Ståle Undheim staa...@gmail.com wrote:



  I have a pretty strange error that I can't figure out the cause off.
  This is in a Django app.

  I am using berkelydb, with secondary databases for indexing. The
  secondary databases are associated with a callback that uses cPickle
  to serialize index values. The problem is that cPickle.dumps(value)
  fails when I run it throughmod_wsgior mod_python on the deployment
  server (Ubuntu Linux 8.10), but works fine when when I use Djangos
  runserver on the same computer. Also, on my own computer (Ubuntu Linux
  8.10), it works fine through mod_python.

  Each time I call on cPickle.dumps(value) I get:
  SystemError(Parent module 'd4' not loaded,)

  Using sys.exc_info() I get no type or traceback, just that exception.
  The callstack as far as I can figure is:

  django
  view
  bsddb.put
  indexer callback
  cPickle.dumps

  cPickle.loads works fine within the callback, I can also use
  cPickle.dumps() outside the indexer callback. But inside the callback,
  I need to use normal pickle instead. I just want to know why. I am
  assuming it has something to do with the fact that I go from python to
  C (bsddb) back to python (indexer callback) and back to C (cPickle).
  It is still strange then that cPickle.loads() work, but not
  cPickle.dumps(). I am also only storing integer values when I get this
  error, so no fancy list, dictionaries or objects.

 Where is module 'd4'? Is that one of yours defined inside of your
 Django project?


d4 is the root project name. This message occurs in d4/views.py.

Here is how I set up my wsgi.py - which is in the d4/ folder:
  sys.path.append(path.join(path.dirname(__file__), '..'))

  os.environ['DJANGO_SETTINGS_MODULE'] = 'd4.settings'
  application = django.core.handlers.wsgi.WSGIHandler()

 One of the problems with Django runserver is that the parent of the
 site directory and the site directory are effectively starting points
 for searching for modules, even though neither is explicitly listed in
 sys.path. The parent is used because runserver does momentarily add
 parent to sys.path to import site package root, after which it removes
 directory from sys.path. The site directory itself is used because for
 runserver that is the current working directory and imports look there
 automatically.

 End result is that modules inside of site can be imported either via
 site package root, or direct. For example, if d4.py was at same level
 as settings.py file and site was called mysite, you could import it as
 mysite.d4 or just d4. This is bad because means you could end up with
 two copies of a module imported under the different name references.

Everywhere in the code, the imports refer to d4.something.something.
All urls.py files refer to the full package names. The test code where
I am running this is actually quit minimal.

 If they way the pickle was done in application was such that reference
 was via d4, and then when you deployed to mod_python or mod_wsgi you
 only added parent directory of site to Python path, then it will not
 be able to find d4, since at that point would only be found as
 mysite.d4.


I use import cPickle as pickle at the top off my views file. So I
don't reference imports from other files.

 If this is the case, add the site directory to Python path by setting
 PythonPath for mod_python or sys.path in WSGI script file for
 mod_wsgi. Better still, fix up your code so module references in code,
 ie., urls.py, or anywhere else, are always done by site package root
 reference and not direct. Ie., such that it uses mysite.d4 and not
 just d4.

 Would that seem about right?

Unfortunatly, at least to me, it seems that all code is allready
correctly using packagenames. The views.py file where I am testing
this is a simple file that doesn't depend on anything else in the
project. It only imports a set of system modules for testing and info.
The only dependency is really the urls.py file, which does refer to
all the views as d4.views.somemethod.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Parent module not loaded error

2009-01-14 Thread Graham Dumpleton
On Jan 14, 9:41 pm, Ståle Undheim staa...@gmail.com wrote:
 On Jan 14, 11:31 am, Graham Dumpleton graham.dumple...@gmail.com
 wrote:



  On Jan 14, 9:20 pm, Ståle Undheim staa...@gmail.com wrote:

   I have a pretty strange error that I can't figure out the cause off.
   This is in a Django app.

   I am using berkelydb, with secondary databases for indexing. The
   secondary databases are associated with a callback that uses cPickle
   to serialize index values. The problem is that cPickle.dumps(value)
   fails when I run it throughmod_wsgior mod_python on the deployment
   server (Ubuntu Linux 8.10), but works fine when when I use Djangos
   runserver on the same computer. Also, on my own computer (Ubuntu Linux
   8.10), it works fine through mod_python.

   Each time I call on cPickle.dumps(value) I get:
   SystemError(Parent module 'd4' not loaded,)

   Using sys.exc_info() I get no type or traceback, just that exception.
   The callstack as far as I can figure is:

   django
   view
   bsddb.put
   indexer callback
   cPickle.dumps

   cPickle.loads works fine within the callback, I can also use
   cPickle.dumps() outside the indexer callback. But inside the callback,
   I need to use normal pickle instead. I just want to know why. I am
   assuming it has something to do with the fact that I go from python to
   C (bsddb) back to python (indexer callback) and back to C (cPickle).
   It is still strange then that cPickle.loads() work, but not
   cPickle.dumps(). I am also only storing integer values when I get this
   error, so no fancy list, dictionaries or objects.

  Where is module 'd4'? Is that one of yours defined inside of your
  Django project?

 d4 is the root project name. This message occurs in d4/views.py.

 Here is how I set up my wsgi.py - which is in the d4/ folder:
   sys.path.append(path.join(path.dirname(__file__), '..'))

   os.environ['DJANGO_SETTINGS_MODULE'] = 'd4.settings'
   application = django.core.handlers.wsgi.WSGIHandler()

  One of the problems with Django runserver is that the parent of the
  site directory and the site directory are effectively starting points
  for searching for modules, even though neither is explicitly listed in
  sys.path. The parent is used because runserver does momentarily add
  parent to sys.path to import site package root, after which it removes
  directory from sys.path. The site directory itself is used because for
  runserver that is the current working directory and imports look there
  automatically.

  End result is that modules inside of site can be imported either via
  site package root, or direct. For example, if d4.py was at same level
  as settings.py file and site was called mysite, you could import it as
  mysite.d4 or just d4. This is bad because means you could end up with
  two copies of a module imported under the different name references.

 Everywhere in the code, the imports refer to d4.something.something.
 All urls.py files refer to the full package names. The test code where
 I am running this is actually quit minimal.

  If they way the pickle was done in application was such that reference
  was via d4, and then when you deployed to mod_python or mod_wsgi you
  only added parent directory of site to Python path, then it will not
  be able to find d4, since at that point would only be found as
  mysite.d4.

 I use import cPickle as pickle at the top off my views file. So I
 don't reference imports from other files.

  If this is the case, add the site directory to Python path by setting
  PythonPath for mod_python or sys.path in WSGI script file for
  mod_wsgi. Better still, fix up your code so module references in code,
  ie., urls.py, or anywhere else, are always done by site package root
  reference and not direct. Ie., such that it uses mysite.d4 and not
  just d4.

  Would that seem about right?

 Unfortunatly, at least to me, it seems that all code is allready
 correctly using packagenames. The views.py file where I am testing
 this is a simple file that doesn't depend on anything else in the
 project. It only imports a set of system modules for testing and info.
 The only dependency is really the urls.py file, which does refer to
 all the views as d4.views.somemethod.

As a test, just prior to where unpickle is done, do:

  import sys
  import d4

  print  sys.stderr, d4.__name__, dr.__name__
  print  sys.stderr, d4.__file__, dr.__file__

This will just confirm that manual import works and what values of
those attributes are. The messages will end up in Apache error log for
that virtual host or main server error log as appropriate.

Graham
--
http://mail.python.org/mailman/listinfo/python-list


Re: Parent module not loaded error

2009-01-14 Thread Ståle Undheim
On Jan 14, 11:48 am, Graham Dumpleton graham.dumple...@gmail.com
wrote:
 As a test, just prior to where unpickle is done, do:

   import sys
   import d4

   print  sys.stderr, d4.__name__, dr.__name__
   print  sys.stderr, d4.__file__, dr.__file__

 This will just confirm that manual import works and what values of
 those attributes are. The messages will end up in Apache error log for
 that virtual host or main server error log as appropriate.

d4.__name__ d4
d4.__file__ /home/petromarker/django-apps/d4/src/d4/../d4/__init__.pyc

It's the same both before and after the exception.
--
http://mail.python.org/mailman/listinfo/python-list