How to refer to the current module?

M

Mike

I want to do something like the following (let's pretend that this is
in file 'driver.py'):

#!/bin/env python

import sys

def foo():
print 'foo'

def bar(arg):
print 'bar with %r' % arg

def main():
getattr(driver, sys.argv[1])(*sys.argv[2:])

if __name__=='__main__':
main()


Essentially what I'm trying to get at here is dynamic function
redirection, like a generic dispatch script. I could call this as

python driver.py foo

or

python driver.py bar 15

and at any time later I can add new functions to driver.py without
having to update a dispatch dict or what-have-you.

The problem is, 'driver' doesn't exist in main() line 1. If I 'import
driver' from the command line, then getattr(driver, ...) works, but
it's not bound here.

Is there any way around this? Can I somehow scope the 'current
module' and give getattr(...) an object that will (at run time) have
the appropriate bindings?

Thanks in advance for all advice!

Mike
 
G

Guilherme Polo

2008/1/7 said:
I want to do something like the following (let's pretend that this is
in file 'driver.py'):

#!/bin/env python

import sys

def foo():
print 'foo'

def bar(arg):
print 'bar with %r' % arg

def main():
getattr(driver, sys.argv[1])(*sys.argv[2:])

if __name__=='__main__':
main()


Essentially what I'm trying to get at here is dynamic function
redirection, like a generic dispatch script. I could call this as

python driver.py foo

or

python driver.py bar 15

and at any time later I can add new functions to driver.py without
having to update a dispatch dict or what-have-you.

The problem is, 'driver' doesn't exist in main() line 1. If I 'import
driver' from the command line, then getattr(driver, ...) works, but
it's not bound here.

Is there any way around this? Can I somehow scope the 'current
module' and give getattr(...) an object that will (at run time) have
the appropriate bindings?

globals() =)
 
C

Christian Heimes

Mike said:
Is there any way around this? Can I somehow scope the 'current
module' and give getattr(...) an object that will (at run time) have
the appropriate bindings?

globals() for the current name space

import sys
sys.modules[__name__] gets you the module object

Christian
 
S

Stargaming

I want to do something like the following (let's pretend that this is in
file 'driver.py'):

#!/bin/env python

import sys

def foo():
print 'foo'

def bar(arg):
print 'bar with %r' % arg

def main():
getattr(driver, sys.argv[1])(*sys.argv[2:])

if __name__=='__main__':
main()


Essentially what I'm trying to get at here is dynamic function
redirection, like a generic dispatch script. I could call this as

python driver.py foo

or

python driver.py bar 15

and at any time later I can add new functions to driver.py without
having to update a dispatch dict or what-have-you.

The problem is, 'driver' doesn't exist in main() line 1. If I 'import
driver' from the command line, then getattr(driver, ...) works, but it's
not bound here.

Is there any way around this? Can I somehow scope the 'current module'
and give getattr(...) an object that will (at run time) have the
appropriate bindings?

Thanks in advance for all advice!

Mike

`__main__` (after you did ``import __main__``) could be an option as
well. But I'd prefer a custom dictionary for your dispatch, rather than
some magic with the module's names.

See http://docs.python.org/ref/programs.html for details on __main__.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top