【问题标题】:How to import modules that import other modules without using import *如何在不使用 import * 的情况下导入导入其他模块的模块
【发布时间】:2014-03-20 15:54:19
【问题描述】:

在父类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 *,同时仍能正确导入父模块及其导入的模块?

【问题讨论】:

  • 当询问您的程序抛出的错误或异常时,请务必包含异常的全文和回溯。
  • 好吧,您可以只使用import BaseHandler, os, sys,但这需要您知道basehandler 模块中包含哪些模块。为什么你不在两个文件中都只使用import os, sys 有什么原因吗?
  • @moritz:: taht 不是 python 的工作方式 - O.P. 可能会出错。
  • 应该可以 - 请输入您的“main.py”导入列表和堆栈跟踪(错误消息包含文件名和行号)
  • @jsbueno 也许我没有正确理解这个问题。 OP 想要从父模块导入导入而不在main.py 中明确写出,对吧?

标签: python python-2.7 import


【解决方案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】:

    引用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 中的模块列表?

    【讨论】:

    • 除非必须,否则不要使用exec(这里不需要)。模块已经导入;您不需要再次导入它们,例如,如果您使用 import basehandler,它们可以作为 basehandler.os 使用,等等。如果您需要导入模块,请使用__import__importlib.import_module 函数。见my answer for a cleaner solution
    【解决方案3】:

    我说那里还有其他问题 - 从其他地方导入您的“basehandler”模块应该可以工作: 它需要的名称、模块、类和对象绑定到它自己的命名空间, 并且存在于该模块中定义的任何代码的globals 字典中 - 不管你用from basehandler import BaseHandler 声明得到它。

    请发布您的完整回溯,以便人们了解那里实际发生的情况。

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2022-01-14
      • 2018-11-10
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2013-08-22
      相关资源
      最近更新 更多