【问题标题】:Force import from a function in another module强制从另一个模块中的函数导入
【发布时间】:2013-07-15 06:45:37
【问题描述】:

好的,我正在尝试对 python 版本 3.3.2 做一些事情我正在尝试导入模块,所以我不必重新启动 shell。以下只是最终代码可以更改的示例:

def importing():
    x = compile('import sys',"<string","exec")
    exec(x)
    return True

这个问题是当我使用 test.importing() 调用它时它返回 True 但是当我执行 sys 时它说:

 Traceback (most recent call last):
  File "<pyshell#74>", line 1, in <module>
    sys
NameError: name 'sys' is not defined

令我困惑的是,尽管它在 shell 中运行良好,但任何想法或建议都会非常感谢我。

【问题讨论】:

  • user2234026:这是一个非常糟糕的标题! “python”标签的重点是你在 python 中遇到了问题!您的标题应该告诉我们您遇到的实际问题!例如,“在编译语句中导入问题”。
  • 您的问题似乎与这个几乎相同:stackoverflow.com/questions/951124/…

标签: python


【解决方案1】:

如果你只是想重新加载一个模块,你可以这样做

from imp import reload
reload(sys)

【讨论】:

  • 我想知道,为什么你需要重新加载sys?这不像你可以改变它,需要重新加载......
  • 我们需要导入重载吗?不是内置函数吗?
  • 在 Python 2.x 中内置,但在 3.x 中没有
  • 我认为 sys-import 只是一个保证存在的模块,用于测试目的。
【解决方案2】:

如果你想动态导入模块,你可以使用__import__

例如Dive into Python:

>>> sys = __import__('sys')           
>>> os = __import__('os')
>>> re = __import__('re')
>>> unittest = __import__('unittest')
>>> sys                               
>>> <module 'sys' (built-in)>
>>> os
>>> <module 'os' from '/usr/local/lib/python2.2/os.pyc'>

【讨论】:

    【解决方案3】:

    exec 如果没有通过localsglobals,则在当前范围内执行。因此,您的 import sysimporting 范围内导入 sys 模块。见代码:

    >>> def c():
    ...     exec('import sys')
    ...     print(locals())
    ...     print(globals())
    ... 
    >>> c()
    {'sys': <module 'sys' (built-in)>}
    {'__builtins__': <module 'builtins'>, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'c': <function c at 0x7faa068e0320>, 'b': <function b at 0x7faa068e45f0>, 'a': <function a at 0x7faa066abe60>, 'd': <function d at 0x7faa068f6200>, 'inspect': <module 'inspect' from '/usr/lib64/python3.3/inspect.py'>, '__doc__': None}
    

    看,sys 在本地范围内,但不在全局范围内。但要注意,导入是动态执行的,即使是在本地范围内,也不能在函数中直接调用sys。调用会报错,在全局范围内找不到sys:

    >>> def a():
    ...     exec('import sys')
    ...     if sys:
    ...             return True
    ...     else:   
    ...             return False
    ... 
    >>> a()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in a
    NameError: global name 'sys' is not defined
    

    相反,您应该使用locals():

    >>> def b():
    ...     exec('import sys')
    ...     if locals()['sys']:
    ...             return True
    ...     else:
    ...             return False
    ... 
    >>> b()
    True
    

    最后,我认为使用exec 不是一个好的选择。就像其他人提到的那样,使用__importing__

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2018-04-06
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多