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

Python 如何导入导入其他模块而不使用导入的模块*,python,python-2.7,import,Python,Python 2.7,Import,在父类basehandler.py中,有几个导入语句、一个常量和一个类: import os import sys import cgi import json JINJA_ENVIRONMENT = jinja2.Environment(foobar) class BaseHandler(webapp2.RequestHandler): pass 另一个模块,main.py然后从basehandler导入* 如果我们使用from basehandler import baseha

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

import os
import sys
import cgi
import json

JINJA_ENVIRONMENT = jinja2.Environment(foobar)

class BaseHandler(webapp2.RequestHandler):
    pass
另一个模块,
main.py
然后从basehandler导入*

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

如何避免从foo import*导入
,同时仍然正确导入父模块及其导入的模块?

引用,您可以在
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
中重新导入模块列表,有什么特别的原因吗?

我说还有其他问题- 从其他地方导入“basehandler”模块应该可以正常工作: 它需要的名称、模块、类和对象都绑定到它自己的名称空间, 并且出现在该模块中定义的任何代码的
全局
字典中—— 不管您如何使用basehandler import basehandler
语句获得它

请发布您的完整回溯,以便人们能够了解那里到底发生了什么

然后,不会接收父类导入的模块,程序会抛出异常

如果您的程序使用模块,则应将其导入模块本身,而不是其他模块,例如,在程序中使用
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

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

当询问程序引发的错误或异常时,请始终包括异常的全文和回溯。好的,您可以导入BaseHandler,os,sys
但这要求您知道
basehandler
模块中包括哪些模块。你为什么不在这两个文件中导入os和sys呢?@moritz::taht不是python的工作方式-O.P.可能在做其他错误的事情。这应该就行了-请把你的“main.py”导入列表和stacktrace(错误消息包含文件名和行号)@也许我没有正确理解这个问题。OP希望从父模块导入导入,而无需在
main.py
中显式写入,对吗?除非必须使用
exec
(此处不需要)。模块已经导入;您不需要再次导入它们,例如,如果您使用了
import basehandler
,则它们可以作为
basehandler.os
使用。如果需要导入模块,请使用
\uuuuu import\uuuu
importlib.import\u module
功能。看见