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
功能。看见