dynamically importing a module and function

R

rkmr.em

Hi
I have a function data['function'], that I need to import from a file
data['module'], in the directory data['cwd']

If I do this from python interactive shell (linux fedora core 8) from
dir /home/mark it works fine:

cwd = data['cwd']
os.chdir(cwd)
print os.getcwd()
module = __import__(data['module'])
function = getattr(module, data['function'])

But if I put this in a file /home/mark/work/common/funcq.py and run it
from /home/mark, it throws me error like this.. how to fix this? it
imports the module successfully, but it is not looking for subsequent
modules in the os.getcwd()..

/home/mark/work/proj1
Traceback (most recent call last):
File "/home/mark/work/common/funcq.py", line 60, in <module>
if __name__ == '__main__':do()
File "/home/mark/work/common/funcq.py", line 33, in do
module = __import__(data['module'])
File "/home/mark/app.py", line 5, in <module>
import abcde
ImportError: No module named abcde
 
J

John Machin

Hi
I have a function data['function'], that I need to import from a file
data['module'], in the directory data['cwd']

OT: Any good reason for using a dictionary instead of a class instance
(data.functiom, data.module, etc)?
If I do this from python interactive shell (linux fedora core 8) from
dir /home/mark it works fine:

cwd = data['cwd']
os.chdir(cwd)
print os.getcwd()
module = __import__(data['module'])
function = getattr(module, data['function'])

This is possibly due to python using what was the current working
directory when it started up.

An alternative (untested):

saved = sys.path
sys.path = data['cwd']
module = __import__(data['module'])
sys.path = saved

Exception handling is left as an exercise for the reader.

HTH,
John
 
R

rkmr.em

data['module'], in the directory data['cwd']
OT: Any good reason for using a dictionary instead of a class instance
(data.functiom, data.module, etc)?
not really, i just wanted to stick to primitive python data types.

If I do this from python interactive shell (linux fedora core 8) from
dir /home/mark it works fine:

cwd = data['cwd']
os.chdir(cwd)
print os.getcwd()
module = __import__(data['module'])
function = getattr(module, data['function'])
saved = sys.path
sys.path = data['cwd']
module = __import__(data['module'])
sys.path = saved

now the module gets loaded, but i am not able to get the function from
the module, though it works fine in the interactive-shell

Traceback (most recent call last):
File "/home/mark/work/common/funcq.py", line 62, in <module>
if __name__ == '__main__':do()
File "/home/mark/work/common/funcq.py", line 35, in do
function = getattr(module, data['function'])
AttributeError: 'module' object has no attribute 'new'


this works in shell though..1
 
J

John Machin

data['module'], in the directory data['cwd']
OT: Any good reason for using a dictionary instead of a class instance
(data.functiom, data.module, etc)?
not really, i just wanted to stick to primitive python data types.

If I do this from python interactive shell (linux fedora core 8) from
dir /home/mark it works fine:

cwd = data['cwd']
os.chdir(cwd)
print os.getcwd()
module = __import__(data['module'])
function = getattr(module, data['function'])
saved = sys.path
sys.path = data['cwd']
module = __import__(data['module'])
sys.path = saved

now the module gets loaded, but i am not able to get the function from
the module, though it works fine in the interactive-shell

Traceback (most recent call last):
File "/home/mark/work/common/funcq.py", line 62, in <module>
if __name__ == '__main__':do()
File "/home/mark/work/common/funcq.py", line 35, in do
function = getattr(module, data['function'])
AttributeError: 'module' object has no attribute 'new'


this works in shell though..1

It's not at all obvious that the "works in shell" code is the same as
the code in your script.

Consider the possibility that as a result of frantic experimentation you
have multiple copies of app.* with varying contents lying around.

Try this in your script so that you can see exactly what it is doing,
instead of comparing it to a strawman:
print "attempting to import", whatever
module = __import__(whatever)
print "got", module.__name__, "from", os.path.abspath(module.__file__)
print "module contents":, dir(module)
 
R

rkmr.em

saved = sys.path
sys.path = data['cwd']
module = __import__(data['module'])
sys.path = saved

import os
os.chdir('/home/mark/work/proj1')
import sys
sys.path.append('/home/mark/work/proj1')
module = __import__('app')
function = getattr(module, 'new')
function(1)
1

It's not at all obvious that the "works in shell" code is the same as the
code in your script.

Consider the possibility that as a result of frantic experimentation you
have multiple copies of app.* with varying contents lying around.
thanks a lot!
there was a file app.pyc lying around in the dir from which i was
running the script...
 

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,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top