Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   myparentclass.__subclasses__() not working for me (http://www.velocityreviews.com/forums/t698223-myparentclass-__subclasses__-not-working-for-me.html)

samwyse 09-14-2009 01:30 PM

myparentclass.__subclasses__() not working for me
 
### I've tried this under both Python 2.5.1 and 3.1.1, and it isn't
working with either one. Here is my program:

class Plugin(object):
"""This is the base object for a plug-in."""
pass

def load_plugins(plugin_subdir='plugins'):
import sys, pkgutil, imp, os.path

try:
# Use this path if we're running as a module.
homedir = __path__[0]
except NameError:
# Use this path if we're running stand-alone.
homedir = sys.path[0]
plugin_path = [ os.path.join(homedir, plugin_subdir) ]

modules = {}
for loader, name, is_pkg in pkgutil.iter_modules(plugin_path):
file, pathname, desc = imp.find_module(name, plugin_path)
modules[name] = imp.load_module(name, file, pathname, desc)
for pair in modules.items():
print('name = %r\nmodule = %r\n' % pair)

if __name__ == '__main__':
print('subclasses = %r\n' %(Plugin.__subclasses__()))
load_plugins()
print('subclasses = %r\n' %(Plugin.__subclasses__()))

### And here is my plugin, in plugins/myplugin.py:

from plugin import Plugin
class MyPlugin(Plugin):
pass

### When I run the main program, I get this:

subclasses = []

name = 'myplugin'
module = <module 'myplugin' from 'C:\Documents and Settings\sam_denton
\Desktop\scripting\plugins\myplugin.py'>

subclasses = []

### Obviously, myplugin is being found found and loaded, but my base
class doesn't know about it. Any ideas?

Gabriel Genellina 09-14-2009 03:16 PM

Re: myparentclass.__subclasses__() not working for me
 
En Mon, 14 Sep 2009 10:30:07 -0300, samwyse <samwyse@gmail.com> escribió:

> ### I've tried this under both Python 2.5.1 and 3.1.1, and it isn't
> working with either one. Here is my program:
>
> class Plugin(object):
> """This is the base object for a plug-in."""
> pass
>
> def load_plugins(plugin_subdir='plugins'):
> import sys, pkgutil, imp, os.path
>
> try:
> # Use this path if we're running as a module.
> homedir = __path__[0]
> except NameError:
> # Use this path if we're running stand-alone.
> homedir = sys.path[0]
> plugin_path = [ os.path.join(homedir, plugin_subdir) ]
>
> modules = {}
> for loader, name, is_pkg in pkgutil.iter_modules(plugin_path):
> file, pathname, desc = imp.find_module(name, plugin_path)
> modules[name] = imp.load_module(name, file, pathname, desc)
> for pair in modules.items():
> print('name = %r\nmodule = %r\n' % pair)
>
> if __name__ == '__main__':
> print('subclasses = %r\n' %(Plugin.__subclasses__()))
> load_plugins()
> print('subclasses = %r\n' %(Plugin.__subclasses__()))
>
> ### And here is my plugin, in plugins/myplugin.py:
>
> from plugin import Plugin
> class MyPlugin(Plugin):
> pass
>
> ### When I run the main program, I get this:
>
> subclasses = []
>
> name = 'myplugin'
> module = <module 'myplugin' from 'C:\Documents and Settings\sam_denton
> \Desktop\scripting\plugins\myplugin.py'>
>
> subclasses = []
>
> ### Obviously, myplugin is being found found and loaded, but my base
> class doesn't know about it. Any ideas?


Don't run the first module as a program itself. When it's run as a
program, it's known as '__main__'; when someone executes 'import plugin'
*another* copy is imported under the name 'plugin'.
So your plugin classes inherit from plugin.Plugin but you're printing
__main__.Plugin subclasses.

--
Gabriel Genellina



All times are GMT. The time now is 03:44 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.