如何导入导入其他模块的模块而不使用import *

时间:2014-03-20 15:54:19

标签: python python-2.7 import

在父类basehandler.py中,有几个import语句,一个常量和一个类:

import os
import sys
import cgi
import json

JINJA_ENVIRONMENT = jinja2.Environment(foobar)

class BaseHandler(webapp2.RequestHandler):
    pass

另一个模块main.py然后使用from basehandler import *

导入此父模块

如果我们使用from basehandler import BaseHandlerimport basehandler以避免from foo import *语句,则不会收到父类导入的模块,并且程序会抛出异常。

如何在使用导入的模块正确导入父模块的同时避免from foo import *

3 个答案:

答案 0 :(得分:1)

引用this answer,您可以在basehandler.py中定义一个产生所有导入模块的函数:

import os,sys,cgi,json
import types

def get_imports():
    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            yield val.__name__

...然后在main.py中导入该函数并使用exec导入相关模块:

from basehandler import BaseHandler, get_imports

for i in get_imports():
    exec "import %s" % i

print os.getcwd() #this will work

虽然有一种粗略的方式,但是有一个特定的原因,您不仅仅是在main.py重新导入模块列表吗?

答案 1 :(得分:1)

  

然后没有收到父类导入的模块,程序抛出异常。

如果您的程序使用模块,那么您应该在模块本身中导入它,而不是在其他模块中导入它,例如,在程序中使用import os而不是from foo import *其中foo模块导入内部os


回答标题中的问题:在没有通配符导入的情况下,从其他模块中获取所有导入的模块:

import inspect 
import foo # your other module

# get all modules from `foo` and make the names available
globals().update(inspect.getmembers(foo, inspect.ismodule)) #XXX don't do it

就像from foo import *只导入模块一样。对于通配符导入的相同警告也适用于此。

答案 2 :(得分:0)

我说那里还有其他问题 - 导入你的" basehandler"其他地方的模块应该正常工作: 它需要的名称,模块,类和对象绑定到它自己的命名空间, 并存在于该模块中定义的任何代码的globals字典中 - 无论你使用from basehandler import BaseHandler语句得到它。

请发布您的完整追溯信息,以便人们可以了解实际发生的情况。