在Python脚本中执行另一个Python脚本

6
我有一个场景,我想在我的主Python脚本中动态生成一个Python脚本,并将其存储为字符串,然后在需要时从我的主脚本中执行这个动态生成的脚本。
如果可能的话,应该如何实现呢?
谢谢。

3
这个脚本听起来非常非常痛苦。 - iandisme
15
... 嘿,伙计 ... http://knowyourmeme.com/memes/xzibit-yo-dawg - Moe
7个回答

15

对于文件中的脚本,请使用exec

对于字符串中的脚本,请使用eval

!!! 但是 !!!

在使用来自外部来源的字符串之前,请先进行合理性检查!否则,您会暴露程序内执行任意代码的能力,因此请检查变量范围!

您绝不希望问这个问题:

"对不起,女士,您真的把儿子命名为Robert'); DROP TABLE students; --吗?"

如果您不了解参考,请参阅此快速漫画...

http://xkcd.com/327/

但是,当您使用EVAL时,您要对您eval的指令负全部责任。


1
是的,eval之前要检查输入。一个建议:您能否使用更少的全大写字母,并使用粗体格式(或根本不使用格式)?在所有大写字母中添加后,'spaghetti post'有点难以阅读。 - strager
抱歉之前的帖子格式混乱,后来的消息中我已经改善了很多。 - George Lambert


1

1

0

不太确定这样做是否明智,但是如果您需要执行Python代码,exec 函数岂不正是您所需之选吗?


0

你所尝试做的事情已经有先例了。collections.namedtuple 函数构建一个模板字符串,该字符串传递给 exec 以便动态定义类。


0

从Python 3.11版本开始,execfile(曾经是最方便的函数)不再列为内置函数。

@George Lambert的答案是正确的。我只会添加一些代码以供快速参考。

在脚本中运行脚本

要在脚本“main.py”中运行脚本“run_me.py”,请执行以下操作:

  • run_me.py应该像这样
print("hello_world")
  • main.py 像这样
with open("run_me.py", "r") as fl:
  exec(fl.read())

运行包含在字符串中的代码

使用 eval 来运行包含在字符串中的代码:

  • 主程序文件为 main.py
string_w_py_code = "print('hello world')"
eval(string_w_py_code)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接