【问题标题】:Running a python code within a python script [duplicate]在python脚本中运行python代码[重复]
【发布时间】:2013-01-02 21:04:36
【问题描述】:

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

好吧,我知道一种方法,将字符串写入文件并运行它,但我不希望那样。在不创建任何额外文件的情况下,是否可以运行它?

这是一个例子:

假设我的 python 文件有以下内容

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

内容字符串有一个 python 代码&我想运行它。可能吗 ?

希望我清楚。谢谢!

【问题讨论】:

  • @Blender - 谢谢编辑。我是从手机上发布的,在我意识到之前,您已经对其进行了编辑。 :)
  • 你能告诉我们为什么会有一个带有代码的字符串吗?为什么不把字符串改成函数呢?如果它是您从其他地方读取的数据,如果您不信任来源,那么您将自己打开一个受伤的世界。
  • @Ned Batchelder - 哎呀,我不明白。但是如何在不写入另一个文件的情况下将字符串更改为函数?我没有从任何不受信任的来源读取数据。我只是在做实验。谢谢你的警告,我会小心的。
  • @AshRj - 是的,就是这个!会签出

标签: python


【解决方案1】:

我会提前说:这是一个糟糕的想法,并且取决于字符串的来源,存在严重的安全风险。

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

exec("print 2+2")

编辑:我最初在回答中使用了 eval,这对于评估单个表达式很有用,而 exec 可用于更一般地执行字符串中的任意 python 代码。

相关文档:

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

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

【讨论】:

  • 我没有从任何不受信任的来源读取数据。我只是在做实验。谢谢你的警告,我会小心的。 eval 可以运行完整的 python 代码吗?导入库和东西?谢谢回复!
  • 所以我实际上对 eval 的确切机制有点生疏,而 exec 更适合那种事情。我将编辑我的答案以澄清。
  • 好的,结果 eval 不适用于语句,它仅适用于表达式。
【解决方案2】:

你可以使用eval:

eval(content)

这将满足您的需求,但不建议这样做,特别是如果其他人控制了 content 的内容 - 如果您有 eval,那么入侵您的系统并不难

【讨论】:

  • 我没有从任何不受信任的来源读取数据。我只是在做实验。谢谢你的警告,我会小心的。感谢您的回复!
【解决方案3】:

您是否按照文档中的要求尝试了 exec 方法

exec "print 'Hello, World!'"

【讨论】:

  • 完美运行,谢谢!!
  • 如果对您有帮助,请标记为答案..
【解决方案4】:

根据您尝试执行的代码,您可以使用eval()exec。这两个选项之间有几个区别:

  1. eval() 做了它应该做的事情:它评估一个表达式并返回一个值,而不是执行代码。这意味着您可以调用函数、进行一些算术运算,甚至使用列表推导、生成器或 lambda,但不能执行不是表达式的 Python 语句(例如 Python 2 中的 ifforprint;但是,在Python 3 print 是一个函数,没问题)。
  2. eval() 接受的参数不仅仅是字符串。它得到localsglobals,两个字典,定义范围环境。如果您填写这些字典并将其传递给eval(),您可以使评估几乎(尽管不是真的)不受信任的字符串安全。也许,您甚至可以通过在全局变量中正确设置 __builtins__ 来重新定义内置函数。 http://docs.python.org/2/library/functions.html#eval
  3. exec 也接受全局变量和局部变量。见http://docs.python.org/2/reference/simple_stmts.html#exec。它可以执行一切。而且几乎不可能让它变得相对安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2018-01-08
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多