在父类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 BaseHandler
或import basehandler
以避免from foo import *
语句,则不会收到父类导入的模块,并且程序会抛出异常。
如何在使用导入的模块正确导入父模块的同时避免from foo import *
?
答案 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
语句得到它。
请发布您的完整追溯信息,以便人们可以了解实际发生的情况。