如何导入外部Python脚本?

时间:2011-10-31 19:17:50

标签: python import external

我正在用Python编写游戏引擎,事情是我不知道如何处理外部脚本(想想源引擎mods,LUA)。游戏中的每个场景,实体都可以附加自定义脚本,但游戏引擎在加载场景之前不知道这些脚本。例如,可能会有一个脚本,它会为游戏过场动画制作动画,并且该脚本只能在一个场景中使用。

那么,我想知道的是处理这些脚本的最佳方法是什么?我知道我可以用exec或eval导入它们,但有人说它现在安全了。为什么?我还可以创建一些脚本语言,它将在运行时进行解析,但考虑到Python本身就是脚本语言,我没有看到这一点。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

您可以使用__import__()。假设您的entity的{​​{1}}属性可以是script,也可以是脚本的名称(位于已知位置,位于None),您可以使用以下代码从该脚本运行sys.path函数:

main()

答案 1 :(得分:0)

是的,execeval对于用户提供的数据不安全,例如处理表达式或Web输入。但是,如果你特别希望为用户提供Python的全部功能,并且你了解风险(用户可以任何 - 擦除/读取计算机上的文件,崩溃Python,进入无限循环等等)。 ),使用exec完全没问题。

如果您信任您的游戏脚本设计师,exec。如果等级可以来自互联网上的随机人员,至少让你的玩家意识到风险。

答案 2 :(得分:0)

您可以使用__import__()或使用exec / execfile功能导入外部脚本。很高兴知道:

  • import将脚本编译为字节码,并在首次使用时保存.pyc文件
  • 导入尝试搜索模块,最终创建带有自己命名空间的模块,而不是只执行exec / execfile字符串/文件中的代码。
  • 可以通过在将全局变量作为参数传递给__import__ / execfile期间使用globals builtins来修改您的代码,尽管此方法不是超级安全的,请参阅我的answer to this question例如。