我正在用Python编写游戏引擎,事情是我不知道如何处理外部脚本(想想源引擎mods,LUA)。游戏中的每个场景,实体都可以附加自定义脚本,但游戏引擎在加载场景之前不知道这些脚本。例如,可能会有一个脚本,它会为游戏过场动画制作动画,并且该脚本只能在一个场景中使用。
那么,我想知道的是处理这些脚本的最佳方法是什么?我知道我可以用exec或eval导入它们,但有人说它现在安全了。为什么?我还可以创建一些脚本语言,它将在运行时进行解析,但考虑到Python本身就是脚本语言,我没有看到这一点。任何帮助将不胜感激。
答案 0 :(得分:0)
您可以使用__import__()
。假设您的entity
的{{1}}属性可以是script
,也可以是脚本的名称(位于已知位置,位于None
),您可以使用以下代码从该脚本运行sys.path
函数:
main()
答案 1 :(得分:0)
是的,exec
和eval
对于用户提供的数据不安全,例如处理表达式或Web输入。但是,如果你特别希望为用户提供Python的全部功能,并且你了解风险(用户可以任何 - 擦除/读取计算机上的文件,崩溃Python,进入无限循环等等)。 ),使用exec
完全没问题。
如果您信任您的游戏脚本设计师,exec
。如果等级可以来自互联网上的随机人员,至少让你的玩家意识到风险。
答案 2 :(得分:0)
您可以使用__import__()
或使用exec
/ execfile
功能导入外部脚本。很高兴知道:
.pyc
文件exec
/ execfile
字符串/文件中的代码。__import__
/ execfile
期间使用globals builtins来修改您的代码,尽管此方法不是超级安全的,请参阅我的answer to this question例如。