Importing a file into another module's namespace

G

Gary Oberbrunner

Hi; my first time posting here. I have a somewhat tricky problem I'd
like some help with.

I have a module, foo.bar, that defines a number of functions and
variables as usual. Now after importing foo.bar, I'd like to load
another file of code (say xyz.py), but *into* foo.bar's namespace. So
if xyz.py contains:

def XYZ(arg):
print "Aargh! ", arg
ABC="abc"

then I'd like to be able to do this in my main python file:

import foo.bar
m=sys.modules["foo.bar"] # or something like that
load_module_into_namespace("xyz.py", m)
foo.bar.XYZ("whatever")
print foo.bar.ABC

As you can see it's the middle two lines that have me stumped. Anyone
have any ideas? Oh yes, this needs to work in python 2.2 or so (earlier
is even better).

Here's a tantalizing snippet from the Python "import" doc:
"...If a file is found, it is parsed, yielding an executable code block.
If a syntax error occurs, SyntaxError is raised. Otherwise, an empty
module of the given name is created and inserted in the module table,
and then the code block is executed in the context of this module."

That's kind of what I want to do, except get an existing module and then
execute my xyz.py file's code block in the context of that module, I
think. Any help would be much appreciated!

thanks,

-- Gary
 
S

Steven D'Aprano

I have a module, foo.bar, that defines a number of functions and
variables as usual. Now after importing foo.bar, I'd like to load
another file of code (say xyz.py), but *into* foo.bar's namespace. So
if xyz.py contains:

def XYZ(arg):
print "Aargh! ", arg
ABC="abc"

then I'd like to be able to do this in my main python file:

import foo.bar
m=sys.modules["foo.bar"] # or something like that
load_module_into_namespace("xyz.py", m)
foo.bar.XYZ("whatever")
print foo.bar.ABC


import foo.bar
import xyz
foo.bar.XYZ = xyz.XYZ
foo.bar.ABC = xyz.ABC
del xyz

That gets a tad tedious if module xyz has many objects, so you can do
this:


# (untested)
import foo.bar
import xyz
for name in dir(xyz):
if not name.starts_with('_'):
setattr(foo.bar, name, getattr(xyz, name))
del xyz


But perhaps the easiest thing to do is, if you control foo.bar, to just
add a line to it:

"from xyz import *"

But I suppose if you controlled foo.bar you would have already done that.
 

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

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top