这是我想要做的事情:
file_execed.py
:#!/usr/bin/env python
def foo():
return True
def bar():
return foo()
file_main.py
:#!/usr/bin/env python
import module_to_add_to
exec_results = {}
execfile("file_execed.py", globals(), exec_results)
# Attach objects created by exec to module_to_add_to
for k, v in exec_results.iteritems():
setattr(module_to_add_to, k, v)
module_to_add_to.call()
module_to_add_to.py
:以下作品:
#!/usr/bin/env python
def call():
eval("foo()", globals(), {})
但不是这一个:
#!/usr/bin/env python
def call():
eval("bar()", globals(), {})
NameError: global name 'foo' is not defined
为什么foo()
直接来自module_to_add_to.py
时可以看到bar()
,而不是从eval' ed MySqlConnection con = new MySqlConnection("User ID=root;pwd=test123;Initial Catalog=netcom_demo;Data Source=185.106.208....;");
调用时?{/ p>
答案 0 :(得分:0)
让我们在file_main.py
execfile("file_execed.py", globals(), exec_results)
此行创建两个名为foo
,bar
的函数,并将它们放入dict exec_results
。当创建这些函数时,它们的全局状态(globals()的结果)是我们放在execfile
命令的第二个参数上的,在这种情况下它是全局状态file_main.py
(记住当函数在模块中定义,它被设置为该模块的locals()
,而不是globals()
)
# Attach objects created by exec to module_to_add_to
for k, v in exec_results.iteritems():
setattr(module_to_add_to, k, v)
上面的两个函数foo
,bar
已添加到模块module_to_add_to
。
module_to_add_to.call()
调用上面的函数bar
,当它被调用时,如上所述,它的全局状态是全局状态file_main.py
,所以让我们检查我们在全局状态{{{ 1}}在file_main.py
上方添加以下行:
module_to_add_to.call()
我们得到:
print(globals().keys())
此处没有['exec_results', '__builtins__', '__file__', 'module_to_add_to', '__package__', 'v', '__name__', '__doc__', 'k']
或foo
,这就是您获得bar
例外的原因。
您可以尝试修改代码,如下所示:
NameError
希望这有帮助。