从另一个模块中强制导入一个函数。

5 浏览
0 Comments

从另一个模块中强制导入一个函数。

我正在尝试使用Python版本3.3.2做一些事情,我想导入模块,这样就不必重新启动shell。以下只是一个示例,最终的代码将可以更改:\n

def importing():
    x = compile('import sys',"

\n问题在于,当我使用test.importing()调用它时,它返回True,但是当我使用sys时,它会显示:\n

Traceback (most recent call last):
  File "", line 1, in 
    sys
NameError: name 'sys' is not defined

\n令我困惑的是,在shell中它完全正常工作,请问有什么想法或建议对我来说将非常感谢。

0
0 Comments

使用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不是一个好选择。就像其他人提到的,使用__import__

0
0 Comments

在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函数,并在函数中调用了这个函数。

通过上述方法,就可以在一个函数中强制从另一个模块中导入函数了。这种方法可以在需要时动态导入特定的函数,使代码更加灵活和可扩展。

0
0 Comments

在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`模块。

0