Python 3执行方法:NameError: 定义的函数名没有定义。

问题描述 投票:1回答:1

工作文件:vir.py

def calcCycleOffset():
    global cycleOffset, uc, cs

    cycleOffset = uc - cs
    return cycleOffset


def vir_main():
    calcCycleOffset()


vir_main()
#calcCycleOffset()


print( "vir.py: cycleOffset: ", cycleOffset )

执行文件:exec.py

filename = "./vir.py"
vir_globals = { "uc": 42, "cs": 12, "cycleOffset": -1 }

with open(filename, "rb") as source_file:
    code = compile(source_file.read(), filename, "exec")

exec(code, vir_globals, {} )

print( 'exec: globals.cycleOffset', vir_globals['cycleOffset'] )

这个模式失败了。

Traceback (most recent call last):
  File "exec.py", line 7, in <module>
    exec(code, vir_globals, {} )
  File "./vir.py", line 12, in <module>
    vir_main()
  File "./vir.py", line 9, in vir_main
    calcCycleOffset()
NameError: name 'calcCycleOffset' is not defined

然而,函数 calcCycleOffset() 是 python 所知道的。如果你把 vir.py 中的注释从:

vir_main()
#calcCycleOffset()

换成:

#vir_main()
calcCycleOffset()

那么这个函数就会被调用。

我希望能够在 vir.py 文件中在函数中嵌套函数,并且仍然能够动态执行......

HELP !

谢谢

python-3.x exec dynamic-programming
1个回答
1
投票

正如这里的官方文档中所解释的关于 当地人 对象。https:/docs.python.org3.8libraryfunctions.html#locals。

: 这个字典的内容不应该被修改;修改可能不会影响解释器使用的局部变量和自由变量的值。

而你在这里传递了一个空对象作为locals。

在你的执行文件中,请将你的代码改为.NET。

filename = "./vir.py"
vir_globals = { "uc": 42, "cs": 12, "cycleOffset": -1 }

with open(filename, "rb") as source_file:
    code = compile(source_file.read(), filename, "exec")

exec(code, vir_globals) #remove the empty object here !!

print( 'exec: globals.cycleOffset', vir_globals['cycleOffset'] )

并且它应该向技巧

你也可以看看@thefourtheye的这个问题和出色的回答。在Python 3中使用一个在执行的字符串中定义的函数。

© www.soinside.com 2019 - 2024. All rights reserved.