Import from database

Steve Holden steve at holdenweb.com
Tue Jan 25 12:54:40 EST 2005


Kartic wrote:

> Steve,
> 
> I believe you have to put ntpath, macpath and posixpath in the module
> database for os.path to work.
> 
> I tried it with zipimporter builtin and I got the same traceback till I
> added ntpath.py to my zip file. (Of course, I renamed the original
> ntpath to _ntpath so that the original did not get imported)
> Thanks,
> --Kartic
> 
I'm not sure I understand, as I am currently relying on the system 
implementations of any modules that happen to be loaded before my code 
picks up. As to what's in the database

SELECT *
FROM `module`
WHERE modName LIKE '%path%'

shows that I have macpathm macurlpath, ntpath, nturlpath, os2emxpath and 
posixpath all there (but, as I say, I've already executed the standard 
modules by the time anything of mine gets to run). If I alter my test 
program to:

import dbimp, sys

if __name__ == "__main__":
     dbimp.install()
     k = sys.modules.keys()
     k.sort()
     for kk in k:
         print kk
     #import bsddb.db
     import a.b.c.d
     import bsddb

then I get as output

MySQLdb
MySQLdb.MySQLdb
  ...
MySQLdb.types
UserDict
__builtin__
__main__
_codecs
_locale
_mysql
_mysql_exceptions
_sre
array
cPickle
codecs
copy
copy_reg
db
dbimp
  ...
mx.Misc
mx.Misc.LazyModule
new
nt
ntpath
os
os.path
re
  ...
zipimport
Accepted *db*
found a in db
load_module: a
a loaded: <module 'a' from 'db:a'> pkg: 1
found a.b in db
load_module: a.b
a.b loaded: <module 'a.b' from 'db:a.b'> pkg: 1
found a.b.c in db
load_module: a.b.c
a.b.c loaded: <module 'a.b.c' from 'db:a.b.c'> pkg: 1
found a.b.c.d in db
load_module: a.b.c.d
a.b.c.d loaded: <module 'a.b.c.d' from 'db:a.b.c.d'> pkg: 0
found bsddb in db
load_module: bsddb
found weakref in db
load_module: weakref
weakref loaded: <module 'weakref' from 'db:weakref'> pkg: 0
Traceback (most recent call last):
   File "test.py", line 11, in ?
     import bsddb
   File "/c/steve/Projects/Python/dbimp/dbimp.py", line 49, in load_module
     exec code in module.__dict__
   File "db:bsddb", line 62, in ?
   File "/usr/lib/python2.4/os.py", line 133, in ?
     from os.path import (curdir, pardir, sep, pathsep, defpath, extsep, 
altsep,
ImportError: No module named path

In other words, the os module is /already/ in sys.smodules, as is 
os.path, yet the interpreter is complaining (I presume) that os.path is 
not a module. I don't even know *why* os is being executed a second 
time. I can only assume it's being imported as some other name like 
"bsddb.os" and some element of the import system is actually doing an 
import rather than refusing to guess.

I presume I need to control the import process more closely to make sure 
that this import attempt is rejected, but I can't see how to do that.

regards
  Steve




More information about the Python-list mailing list