2013-01-19 160 views
0

我想要做下面的事情。脚本有一些python代码作为一个字符串(保存在一个变量中),并可以运行该代码吗?在python脚本中运行python代码

嗯,我知道一种方法,将该字符串写入文件&运行它,但我不希望这样。如果不创建任何额外的文件,是否可以运行它?

这里有一个例子:

假设我的Python文件内容如下

#this is a main python file 
content = ''' print 'hello!' 
        print 'this is from sub python code' ''' 
print 'from main python' 

内容串有Python代码&我要运行它。可能吗 ?

希望我清楚。谢谢 !

+0

@Blender - 谢谢编辑。我从移动设备上发布了这个消息,在我意识到之前,你已经编辑了它。 :) – avi

+2

你能告诉我们为什么有一个代码的字符串呢?为什么不只是将字符串更改为函数?如果它是从其他地方读取的数据,那么如果你不相信源,就会让自己开始受到伤害。 –

+0

@Ned Batchelder - 糟糕,我没有得到这个想法。但是,如何将字符串更改为函数,而不写入其他文件? 我不是从任何不受信任的来源读取数据。我只是在试验。感谢警告,我会小心的。 – avi

回答

2

我会先说这个:这是一个可怕的想法,并且根据字符串的来源有严重的安全风险。

这个免责声明,python有一个exec函数,它执行一个包含python代码的字符串。例如:

exec("print 2+2") 

编辑:我最初使用EVAL在我的答案,这是评价个人表现非常有用,而高管可用于在一个字符串的任意Python代码更普遍执行。

相关的文档:

http://docs.python.org/2/reference/simple_stmts.html#exec

http://docs.python.org/2/library/functions.html#eval

+0

我不读取任何不受信任的来源的数据。我只是在试验。感谢警告,我会小心的。 可以评估运行完整的Python代码?与进口图书馆和东西? 感谢您的回复! – avi

+0

所以我确实在eval的确切机制上有点生疏,而exec对于这类事情会更合适。我会编辑我的答案来澄清。 – jrdn

+0

好的,eval并不适用于语句及其唯一的表达式。 – avi

0

那么你可以使用eval

eval(content) 

这会做你想做的,但它不推荐,特别是如果有人else控制着content的内容 - 破解int并不难如果你有eval

+0

我不是从任何不受信任的来源读取数据。我只是在试验。感谢警告,我会小心的。 谢谢你的回复! – avi

0

你有没有试着用exec方法为每个文档应该做

高管“打印‘你好,世界!’”

+0

工作完美,谢谢! – avi

+0

请标记为答案,如果它帮助你.. –

0

根据您要执行的代码Ø系统,您可以使用eval()exec。这两个选项有几个区别:

  1. eval()做它应该做的:它评估一个表达式并返回一个值,而不是执行代码。这意味着你可以调用函数,做一些算术运算,甚至使用列表解析,生成器或lambda表达式,但不执行不是表达式的Python语句(例如,Python 2中的iffor,print;但是在Python 3中,print是一个函数并没有问题)。
  2. eval()接受的参数不只是一个字符串。它得到localsglobals两个词典,定义范围环境。如果您填写并传递这些字典到eval(),您可能会对不可信的字符串进行近乎(但不是真正的)安全评估。也许,你甚至可以通过全局设置__builtins__来重新定义builtins。 http://docs.python.org/2/library/functions.html#eval
  3. exec也接受全局和本地人。见http://docs.python.org/2/reference/simple_stmts.html#exec。它可能会执行一切。而且几乎不可能使其更安全。