【问题标题】:Python how to execute code from a txt filePython如何从txt文件执行代码
【发布时间】:2015-10-20 16:44:39
【问题描述】:

我想将一段代码保存在一个 txt 文件中,并从我的 Python 脚本中执行它。

例如在txt文件中有

print("ok")

我希望我的程序打印 ok 而不是打印 print("ok ")。我该怎么做?

【问题讨论】:

  • 你几乎不想这样做,但如果你这样做,查找 exec。可怕的事情。 颤抖
  • 请记住,这是一个严重的安全风险。想象一下,如果您的文件包含恶意代码会发生什么!
  • 我想为一个游戏创建一个关卡编辑器,但这是我唯一想到的方法,我需要将数据堆叠到另一个文件中然后使用它
  • 我建议您为此使用某种结构化文本文件。 XML 在这里可能是一个不错的选择。因此,您将游戏关卡信息存储在 xml 文件中并在您的游戏中使用。

标签: python file execute


【解决方案1】:

做你想做的事通常会带来安全风险,但不一定如此。

你一定要通知用户潜在的风险。

使用execfile()或compile()和exec语句提供插件系统的程序不止一个。

没有什么比这更丑陋的了,你只需要知道你在做什么,什么时候在哪里。

execfile()、eval() 和 exec 语句都允许您指定执行/评估代码的范围。

myscope = {}
execfile("myfile.txt", myscope)

这将防止新代码与旧代码混合。 myfile.txt 中的所有变量类、函数和模块都将包含在 myscope 字典中。

但是,这并不能阻止恶意代码从您的磁盘或类似的东西中删除所有文件。

Python 2 有一个不错的模块,叫做 rexec,但从 Python 2.2 开始,它就不再工作了。

它在受限环境中实现 execfile() exec 语句和 eval()。 虽然它不起作用,但它就在那里,您可以挖掘代码以了解它是如何完成的。

因此,您看,可以只允许从外部源执行安全代码(好吧,尽可能安全)。

还有另一种方法。 您可以加载该文件,从中编译代码,然后检查它以查看它的作用。然后说,是的,我会执行它或不,我不会。然而,这需要更多的工作和很多复杂性。

但是,我认为没有必要经历所有这些事情。请详细说明您的问题。关卡编辑器到底是什么意思? 我不认为外部代码可以解决这个问题。

【讨论】:

  • 好吧,所以我的游戏是一艘基本上可以射击怪物的宇宙飞船,所以关卡编辑器是让用户简单地创建一个关卡(在它生成时选择怪物的类型,选择背景等..)例如创建一个怪物它的 5 行代码,所以当用户按下新怪物按钮时,它会自动将这 5 行与他的参数一起写入 txt 文件。这是我现在的计划,如果您有其他想法,请告诉我
  • 你有一个怪物,我接受它。如果是这样,那么改变它的属性以反映你想要的东西是微不足道的。您可以定义更多怪物类型,并在运行时执行以下操作:'newmonster = object(); newmonster.speed = 50;对于 dir(crocodile) 中的 x:setattr(newmonster, x, getattr(crocodile, x))'。通过这种方式,您将制作速度为 50 的新鳄鱼。您当然可以通过巧妙设计的继承将这一切自动化。
  • 要全部保存,您可以使用 configparser 模块将仅选定的属性值保存为 INI 文件,或设计您自己的文件,或使用 pickle/cPickle 模块将它们保存为 'import cPickle作为泡菜; f = open("newmonster.txt", "wb"); pickle.dump(newmonster, f); f.close()' 加载将使用 pickle.load() 完成,但是使用动态填充的对象来完成它会有点棘手。但它会起作用。
  • ok execfile 函数在 python 3.0 中不存在,更多你必须使用 exec(open("file.txt").read())
  • 是和不是。可以在文件中插入多个泡菜,然后手动解析以将它们分开。使用 pickle.dumps() 和 pickle.loads() 而不是直接向/从文件写入/加载。但是将所有对象放入字典或列表中并腌制它更容易。然后在 unpickling 时,您只需打开该字典。它会完美运行。
【解决方案2】:

你正在寻找eval函数

eval 是一个函数,它将任意 python 代码表示为一个字符串并在运行时执行它。

示例

>>> x = 1
>>> y = eval('x+1')
>>> print(y)
2

它适用于 Python 2.x 和 3.x

查看文档https://docs.python.org/2.7/library/functions.html#eval

【讨论】:

  • 不,没有! eval() 评估 Python 表达式,它不执行任意代码。试试:'eval("print 'abcd'")' 你会得到 SyntaxError。 :D 但你只错了一半,因为 eval() 允许执行代码对象,它们可能包含任何东西,而不仅仅是表达式。所以: 'eval(compile("print 'abcd'", "blah.py", "exec"))' 会起作用。
  • 感谢您的信息!下次我会先测试再回答
猜你喜欢
  • 2017-02-25
  • 2020-09-18
  • 2021-06-03
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多