Re: function to do dynamic import?

2007-09-12 Thread Peter Otten
Am Wed, 12 Sep 2007 11:54:51 +1000 schrieb bambam:

 def gim():
 exec global gamel
 exec import gamel
 
 Unfortunately, does not have the desired effect.
 Steve.

Both statements have to be part of a single exec:

def gim():
modulename = gamel # determined at runtime
exec global %s; import %s % (modulename, modulename)

It may work, but it is still a bad idea to create global variables with a
name not known until runtime.

Peter
-- 
http://mail.python.org/mailman/listinfo/python-list


function to do dynamic import?

2007-09-11 Thread bambam
import works in the main section of the module, but does
not work as I hoped when run inside a function.

That is, the modules import correctly, but are not visible to
the enclosing (global) scope.

Questions:
(1) Where can I read an explanation of this?
(2) Is there a work around?

BTW, sys.modules(filename) shows that the module is
loaded, I just don't know how to use it when loaded that
way.  Also, if I import again at the global scope, the module
name becomes available.

Steve.

---
 def gim():
... exec import gamel
...
 gim()
 sys.modules[gamel]
module 'gamel' from 'c:\gamel.pyc'
gamel
NameError: name 'gamel' is not defined
exec import gamel
gamel
module 'gamel' from 'c:\gamel.pyc' 


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread [EMAIL PROTECTED]
On Sep 10, 10:52 pm, bambam [EMAIL PROTECTED] wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.

 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.

 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?

 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.

 Steve.



(snipped)

This was recently discussed:

http://groups.google.com/group/comp.lang.python/msg/f6fcdf49710cb833

--
Hope this helps,
Steven

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread J. Cliff Dyer
bambam wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.

 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.

 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?

 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.

 Steve.

 ---
   
 def gim():
 
 ... exec import gamel
 ...
   
All you have done in this function is bind the module to the name gamel
within the scope of the function.  As soon as the function exits, the
module goes out of scope.  If you want to use it externally, return the
module.

def: gim():
import gamel
return gamel
 gim()
 
This will have to change to

gamel = gim()

and the rest should work as expected.
 sys.modules[gamel]
 
 module 'gamel' from 'c:\gamel.pyc'
   
 gamel
 
 NameError: name 'gamel' is not defined
   
 exec import gamel
 gamel
 
 module 'gamel' from 'c:\gamel.pyc' 


   

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread Steve Holden
bambam wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.
 
 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.
 
 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?
 
 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.
 
There's not much wrong with doing this, since it gives you the best of 
both worlds. But you mean sys.modules[filename], don't you?

 def gim():
 ... exec import gamel
 ...
 gim()
 sys.modules[gamel]
 module 'gamel' from 'c:\gamel.pyc'
 gamel
 NameError: name 'gamel' is not defined
 exec import gamel
 gamel
 module 'gamel' from 'c:\gamel.pyc' 
 
 
Whoa there! There's a lot of difference between importing a module 
inside a function and executing an import statement inside a function.

If you want to do dynamic imports then the __import__ function is what 
you need. Trying to use exec like that is a bad idea unless you clearly 
understand the relationship between the different namespaces involved. 
In fact, trying to use exec at all is a bad idea until you understand 
Python better, and even then it's not often a terrific idea.

Think of exec more as a hack of last resort than the first tool to reach 
for to solve a problem.

regards
  Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC/Ltd   http://www.holdenweb.com
Skype: holdenweb  http://del.icio.us/steve.holden
--- Asciimercial --
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
--- Thank You for Reading -

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread bambam

[EMAIL PROTECTED] wrote in message 
news:[EMAIL PROTECTED]
 On Sep 10, 10:52 pm, bambam [EMAIL PROTECTED] wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.

 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.

 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?

 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.

 Steve.



 (snipped)

 This was recently discussed:

http://groups.google.com/group/comp.lang.python/msg/f6fcdf49710cb833

 --
 Hope this helps,
 Steven


def gim():
exec global gamel
exec import gamel

Unfortunately, does not have the desired effect.
Steve.


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread bambam

J. Cliff Dyer [EMAIL PROTECTED] wrote in message 
news:[EMAIL PROTECTED]
 bambam wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.

 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.

 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?

 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.

 Steve.

 ---

 def gim():

 ... exec import gamel
 ...

 All you have done in this function is bind the module to the name gamel
 within the scope of the function.  As soon as the function exits, the
 module goes out of scope.  If you want to use it externally, return the
 module.

 def: gim():
import gamel
return gamel
 gim()

 This will have to change to

 gamel = gim()

 and the rest should work as expected.
 sys.modules[gamel]

 module 'gamel' from 'c:\gamel.pyc'

 gamel

 NameError: name 'gamel' is not defined

 exec import gamel
 gamel

 module 'gamel' from 'c:\gamel.pyc'





 def: gim():
import gamel
return gamel

Unfortunately, it needs to do dynamic import: I can't list
all of the possible import modules because they are unknown
until runtime.

Steve. 


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread bambam

Steve Holden [EMAIL PROTECTED] wrote in message 
news:[EMAIL PROTECTED]
 bambam wrote:
 import works in the main section of the module, but does
 not work as I hoped when run inside a function.

 That is, the modules import correctly, but are not visible to
 the enclosing (global) scope.

 Questions:
 (1) Where can I read an explanation of this?
 (2) Is there a work around?

 BTW, sys.modules(filename) shows that the module is
 loaded, I just don't know how to use it when loaded that
 way.  Also, if I import again at the global scope, the module
 name becomes available.

 There's not much wrong with doing this, since it gives you the best of 
 both worlds. But you mean sys.modules[filename], don't you?

 def gim():
 ... exec import gamel
 ...
 gim()
 sys.modules[gamel]
 module 'gamel' from 'c:\gamel.pyc'
 gamel
 NameError: name 'gamel' is not defined
 exec import gamel
 gamel
 module 'gamel' from 'c:\gamel.pyc'
 Whoa there! There's a lot of difference between importing a module inside 
 a function and executing an import statement inside a function.

 If you want to do dynamic imports then the __import__ function is what you 
 need. Trying to use exec like that is a bad idea unless you clearly 
 understand the relationship between the different namespaces involved. In 
 fact, trying to use exec at all is a bad idea until you understand Python 
 better, and even then it's not often a terrific idea.

 Think of exec more as a hack of last resort than the first tool to reach 
 for to solve a problem.

 regards
  Steve
 -- 
 Steve Holden+1 571 484 6266   +1 800 494 3119
 Holden Web LLC/Ltd   http://www.holdenweb.com
 Skype: holdenweb  http://del.icio.us/steve.holden
 --- Asciimercial --
 Get on the web: Blog, lens and tag the Internet
 Many services currently offer free registration
 --- Thank You for Reading -


Yes, sys.modules[filename], unfortunately, same mistake
made already 4 or 5 times before I typed this, and still hadn't
learned...many years working in an environment where the
distinction was not important. Sorry.

def gim(self):
for gamel in self.gamel_list:
__import__(gamel['file'])

Works as hoped for. I did a web search for 'dynamic import' and
the only examples I found used exec.

Thanks

Steve. 


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: function to do dynamic import?

2007-09-11 Thread Steve Holden
bambam wrote:
[...]
 def gim(self):
 for gamel in self.gamel_list:
 __import__(gamel['file'])
 
 Works as hoped for. I did a web search for 'dynamic import' and
 the only examples I found used exec.
 
 Thanks
 
Cool. You're getting there!

regards
  Steve
-- 
Steve Holden+1 571 484 6266   +1 800 494 3119
Holden Web LLC/Ltd   http://www.holdenweb.com
Skype: holdenweb  http://del.icio.us/steve.holden
--- Asciimercial --
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
--- Thank You for Reading -

-- 
http://mail.python.org/mailman/listinfo/python-list