Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Why can't I "from module import *" except at module level?

Reply
Thread Tools

Why can't I "from module import *" except at module level?

 
 
Mudcat
Guest
Posts: n/a
 
      01-13-2006
I have a directory structure that contains different modules that run
depending on what the user selects. They are identical in name and
structure, but what varies is the content of the functions. They will
only need to be run once per execution.

Example (directory level):
Sys1:
A
B
C
Sys2:
A
B
C
Sys3:
A
B
C
Sys4:
A
B
C

So if the user selects Sys1 during execution, I want to import the
modules using "from *" and the run the content of those files.

Now the way my program is set up, it is very important that I be able
to "from Sys1 import *" and not "import Sys1". The names of the
functions inside are passed in from somewhere else and the program
requires those function names to be globally scoped.

So I have a function that looks like this:

def importModules( type ):
cwd = os.getcwd()
path = cwd + "\\" + type
sys.path.append(path)

from security import *

Obviously this is not working and I get a syntax error at runtime. So
without this functionality, how do I target modules to import in other
directories after program execution has begun?

Thanks

 
Reply With Quote
 
 
 
 
Mudcat
Guest
Posts: n/a
 
      01-13-2006
Anyone?

Is there any way to do this or am must I load all modules by function
name only if it's after initialization?

 
Reply With Quote
 
 
 
 
Giovanni Bajo
Guest
Posts: n/a
 
      01-14-2006
Mudcat wrote:

> Is there any way to do this or am must I load all modules by function
> name only if it's after initialization?


Not sure. globals().update(mod.__dict__) might do the trick. Or just design a
better system and be done with it.
--
Giovanni Bajo


 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      01-14-2006
On Fri, 13 Jan 2006 10:17:32 -0800, Mudcat wrote:

> I have a directory structure that contains different modules that run
> depending on what the user selects. They are identical in name and
> structure, but what varies is the content of the functions. They will
> only need to be run once per execution.

....
> So if the user selects Sys1 during execution, I want to import the
> modules using "from *" and the run the content of those files.
>
> Now the way my program is set up, it is very important that I be able
> to "from Sys1 import *" and not "import Sys1".


Then change the way your program is set up

Seriously, "from module import *" is generally a bad idea. Not always, but
generally, and in this specific instance I'm not sure that your use case
is one of those exceptions. However, be that as it may be, on to solving
your problem:

When you "import foo" or "from module import foo", the name foo is bound
in the local scope, not global. In other words, the name foo will then
only exist inside the function. So this does not work:

>>> def local_import():

.... import string
....
>>> local_import()
>>> string.whitespace

Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'string' is not defined


However this does work as you would expect:

>>> def func_import():

.... global math
.... import math
....
>>> func_import()
>>> math.sin

<built-in function sin>


See http://docs.python.org/ref/import.html for more detail on what happens
when you import. Keep in mind that it states that "from module import *"
in function blocks is explicitly stated to be an error, and in Python 2.3
a warning is raised:


>>> def wild_import():

.... from math import *
....
<stdin>:1: SyntaxWarning: import * only allowed at module level




> The names of the
> functions inside are passed in from somewhere else and the program
> requires those function names to be globally scoped.
>
> So I have a function that looks like this:
>
> def importModules( type ):
> cwd = os.getcwd()
> path = cwd + "\\" + type
> sys.path.append(path)
>
> from security import *
>
> Obviously this is not working and I get a syntax error at runtime.


Should security be defined somewhere?

> So
> without this functionality, how do I target modules to import in other
> directories after program execution has begun?


I'd consider putting your import logic into a module of its own, at
the module-level and not inside a function. Then just call "from importer
import *" in the top level of your code and I think that should meet your
needs.



--
Steven.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
imp.find_module don't found my module but standard import statement can import this module… why ? Stéphane Klein Python 0 07-05-2011 07:36 AM
Why 'import module' will not import module.py but the directorymodule? Peng Yu Python 0 10-31-2009 11:51 PM
who is simpler? try/except/else or try/except Fabio Z Tessitore Python 5 08-13-2007 12:52 AM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
converting a nested try/except statement into try/except/else John Salerno Python 20 08-11-2006 02:48 PM



Advertisments