Using the `email' module in a bazaar plugin

Julian Smith jules at REMOVETHIS.op59.net
Wed Dec 10 09:20:04 EST 2008


On Wed, 10 Dec 2008 12:13:28 +0000
Matt Nordhoff <mnordhoff at mattnordhoff.com> wrote:

> Julian Smith wrote:
> > I don't seem to be able to use the `email' module from within a bazaar
> > plugin. Other modules work ok, e.g. nntplib.
> > 
> > Here's my plugin, cut-down to show just the email problem:
> > 
> >   import sys
> >   print 'sys.version', sys.version
> > 
> >   import nntplib
> >   n = nntplib.NNTP( 'jsmith-ubuntu2' )
> >   print n
> > 
> >   import email
> >   m=email.MIMEText.MIMEText('text of email')
> > 
> > - and here's the output when i run any bazaar command:
> > 
> >   > bzr status
> >   sys.version 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
> >   [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
> >   <nntplib.NNTP instance at 0xb7b1082c>
> >   'module' object has no attribute 'MIMEText'
> >   Unable to load plugin 'js_notify' from '/home/jsmith/.bazaar/plugins'
> >   ...
> > 
> > The plugin runs fine on its own, it's only when loaded into Bazaar that things
> > go wrong.
> > 
> > I thought perhaps this could be caused by the `email' module's use of
> > LazyImporter. I've tried various things such as `from email.mime.text import
> > MIMEText', and they fail in similar ways.
> > 
> > I'm using bzr-1.9, python 2.5.2, on Ubuntu-8.xx.
> > 
> > Does anyone have any ideas ?
> > 
> > Thanks,
> > 
> > - Julian
> 
> The built-in email module is probably getting shadowed by another one
> (perhaps bzrlib.plugins.email?), so "import email" is importing the
> wrong module. You'll have to rename it to something else.
> 
> Have your plugin print email.__path__ to see which module it is.

Ah, you're quite right.

Curiously, email.__path__ is:

  /usr/lib/python2.5/site-packages/bzrlib/plugins/email

- but sys.path is:

['/usr/bin', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/PIL', '/usr/lib/python2.5/site-packages/gst-0.10', '/var/lib/python-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0', '/var/lib/python-support/python2.5/gtk-2.0']

- i.e. no occurrence of `/usr/lib/python2.5/site-packages/bzrlib/plugins'.

So i guess bazaar is redefining __import__() to look in the the plugins
directory first, or something.

Anyway, I can get things to work with the following:

  import imp
  email = imp.load_module( 'email', *imp.find_module( 'email', sys.path))

Many thanks,

- Julian

-- 
http://op59.net/



More information about the Python-list mailing list