【问题标题】:How can I perform `import *` from within a function?如何从函数中执行“import *”?
【发布时间】:2016-02-02 16:47:10
【问题描述】:

我有以下标准导入程序:

from ROOT import *

由于 ROOT 处理命令行选项和参数的方式,需要类似以下内容以避免搞砸脚本的命令行解析:

argv_tmp = sys.argv
sys.argv = []
from ROOT import *
sys.argv = argv_tmp

我需要在许多脚本中执行此操作。这个操作可能会改变,或者可能会有更好的方法,所以我想把这个过程集中在某个导入模块提供的单个函数中,以便将来更改过程。

def import_ROOT():
    # magic

import os
import sys
import_ROOT()
import docopt

如何从函数中导入 ROOT 模块,以使脚本操作的结果与上述 from ROOT import * 过程的结果相同?

【问题讨论】:

  • 你不应该做那些事。听起来您的 ROOT.py 中没有正确的 main() 函数和 if __name__ == '__main__': main()
  • @PM2Ring 感谢您的评论。 ROOT.py 是一个模块,而不是一个脚本。它没有main 功能。此外,它是ROOT 框架的 Python 绑定基础结构,因此我无法轻易更改它。我需要关注脚本的更改,而不是模块的更改。
  • 啊,好的。尽管如此,尽量避免from <module> import *,如果可以的话。

标签: python import root-framework pyroot


【解决方案1】:

这可能会遗漏各种极端情况,但这是一个开始:

def import_ROOT():
    import ROOT
    globals().update(ROOT.__dict__)

强制性免责声明:如果您导入 *,您可能做错了。但我想在某些情况下 import * 的危害较小。

【讨论】:

    【解决方案2】:

    由于局部变量在 python 中的实现方式,你不能这样做。而且由于您不知道可能导入的所有变量,因此您不能将它们声明为全局变量。

    至于为什么不能在函数中导入未知的本地变量。这是因为在编译时,python 建立了所有可能存在的不同的局部变量(任何直接分配给并且没有被声明为全局或非局部的)。这些局部变量的空间在与函数的每次调用相关联的数组中创建。然后,所有本地人都通过他们在数组中的索引而不是他们的名字来引用。因此,解释器无法为未知的本地人腾出额外的空间,也不知道如何在运行时引用它们。

    【讨论】:

      【解决方案3】:

      我相信这里已经有一个类似的问题:

      Python: how to make global imports from a function

      示例:

      def example_function():
          global module
          import module
      

      【讨论】:

      • 感谢您的建议。我认为这种方法相当于import ROOT as ROOTnot from ROOT import *.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2019-06-05
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多