从另一个模块中强制导入一个函数。
从另一个模块中强制导入一个函数。
我正在尝试使用Python版本3.3.2做一些事情,我想导入模块,这样就不必重新启动shell。以下只是一个示例,最终的代码将可以更改:\n
def importing(): x = compile('import sys',"\n问题在于,当我使用
test.importing()
调用它时,它返回True,但是当我使用sys时,它会显示:\nTraceback (most recent call last): File "", line 1, in sys NameError: name 'sys' is not defined \n令我困惑的是,在shell中它完全正常工作,请问有什么想法或建议对我来说将非常感谢。
使用exec
函数时,如果没有传递locals
和globals
参数,它将在当前作用域中执行。所以,你的import sys
在importing
作用域中导入了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
不是一个好选择。就像其他人提到的,使用__import__
。
在Python中,如果想要动态导入模块,可以使用__import__
函数。通过这个函数,可以在运行时根据需要导入不同的模块。
下面是一个例子,参考自《Dive into Python》:
sys = __import__('sys') os = __import__('os') re = __import__('re') unittest = __import__('unittest')
以上代码使用__import__
函数分别导入了sys、os、re和unittest模块。可以看到,运行后,sys
模块是Python内置的模块,而os
模块是从路径/usr/local/lib/python2.2/os.pyc
中导入的。
然而,有时候我们可能会遇到一个问题:在某个函数中,需要强制从另一个模块中导入函数。
解决这个问题的方法是使用from-import
语句。通过这个语句,可以将另一个模块中的函数导入到当前模块中,然后在函数中使用。
下面是一个示例代码:
def import_func(): from another_module import another_func another_func()
以上代码定义了一个函数import_func
,通过from-import
语句从another_module
中导入了another_func
函数,并在函数中调用了这个函数。
通过上述方法,就可以在一个函数中强制从另一个模块中导入函数了。这种方法可以在需要时动态导入特定的函数,使代码更加灵活和可扩展。
在Python 3.x版本中,由于`reload`函数不再是内置函数,我们需要通过`from imp import reload`语句来导入`reload`函数。那么为什么需要重新导入`sys`模块呢?因为在某些情况下,我们可能会修改了`sys`模块的内容,需要重新加载该模块。
需要注意的是,`sys`模块是Python自带的,通常情况下不会出现需要重新加载的情况。上述代码中的`reload(sys)`可能只是用于测试目的,以确保`reload`函数能够正常工作。
解决方法很简单,只需要使用`from imp import reload`语句导入`reload`函数,然后调用`reload(sys)`函数即可重新加载`sys`模块。这样就可以在需要的时候更新`sys`模块的内容。
总结起来,问题的原因是Python 3.x中的`reload`函数不再是内置函数,需要手动导入。解决方法是使用`from imp import reload`语句导入`reload`函数,并调用`reload(sys)`函数重新加载`sys`模块。