Python如何从txt文件执行代码

Python如何从txt文件执行代码,python,file,execute,Python,File,Execute,我想在txt文件中保存一段代码,并从Python脚本中执行它 例如,在txt文件中有 打印(“确定”) 我希望我的程序打印ok,而不是打印print(“ok”)。我该怎么做?您正在寻找eval函数 eval是一个函数,它接受以字符串表示的任意python代码,并在运行时执行 示例 >>> x = 1 >>> y = eval('x+1') >>> print(y) 2 它可以在Python2.x和3.x中工作 检查文档:做你想做的事通常是一

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

例如,在txt文件中有

打印(“确定”)


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

您正在寻找
eval
函数

eval
是一个函数,它接受以字符串表示的任意python代码,并在运行时执行

示例

>>> x = 1
>>> y = eval('x+1')
>>> print(y)
2
它可以在Python2.x和3.x中工作


检查文档

做你想做的事通常是一种安全风险,但不一定是这样

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

有多个程序使用exefile()或compile()和exec语句提供系统插件

没有什么比这更难看的了,你只需要知道你在做什么,何时何地

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

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

然而,这并不能阻止恶意代码从磁盘或类似的东西中删除它可以删除的所有文件

Python2有一个很好的模块,名为rexec,但是在Python2.2中它不再工作了

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

所以,您可以看到,只允许从外部源执行安全代码(尽可能安全)

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

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

您几乎永远不想这样做,但如果您想这样做,请查找exec。可怕的事情。不寒而栗请记住,这是一个严重的安全风险。想象一下,如果您的文件包含恶意代码,将会发生什么!我想为游戏创建一个关卡编辑器,但这是我想到的唯一方法,我需要将数据堆叠到另一个文件中,然后使用itI。我建议您使用某种结构化文本文件。在这里,XML可能是一个不错的选择。因此,您将在xml文件中存储游戏级别的信息,并在游戏中使用它。不,它不会!eval()计算Python表达式,它不执行任意代码。尝试:“eval”(“打印”abcd'),您将得到SyntaxError.:但是您只错了一半,因为eval()允许执行代码对象,并且它们可能包含任何内容,而不仅仅是表达式。所以:“eval(compile”(“print'abcd'”,“blah.py”,“exec”))将起作用。感谢您提供的信息!下次我会在回答问题之前进行测试,所以我的游戏基本上是一艘可以射击怪物的宇宙飞船,所以关卡编辑器可以让用户简单地创建关卡(选择怪物产生时的类型,选择背景等等)例如,要创建一个怪物,它需要5行代码,因此当用户按下new monster按钮时,它会自动在txt文件中写入这5行代码,其中包含他的参数。这是我现在的计划,如果你有其他想法,请告诉我你有一个怪物代表一个物体,我接受它。如果是这样的话,那么改变它的属性以反映您想要的东西就很简单了。您可以定义更多的怪物类型,并在运行时执行类似的操作:“newmonster=object();newmonster.speed=50;对于dir中的x(鳄鱼):setattr(newmonster,x,getattr(鳄鱼,x))'。这样,你将以50的速度制作新的鳄鱼。当然,您可以通过巧妙设计的继承将其自动化。要保存所有内容,您可以使用configparser模块仅将选定的属性值保存为INI文件,或设计自己的文件,或使用pickle/cPickle模块将其保存为“import cPickle as pickle;f=打开(“newmonster.txt”、“wb”);pickle.dump(newmonster,f);f、 close()'加载将使用pickle.load()完成,但使用动态填充的对象进行加载将有点棘手。但是它可以工作。ok execfile功能在python 3.0和更多版本中不存在。您必须使用exec(open(“file.txt”).read())是和否。可以在文件中插入多个pickle,然后手动解析以将它们分开。使用pickle.dumps()和pickle.loads()代替直接向文件写入/从文件加载。但将所有对象放入字典或列表并对其进行pickle比较容易。然后,当你解开它的时候,你只要打开它,它就会完美地工作。