python - 转义任意代码块

标签 python python-3.x

我的脚本接受任意长度和内容的 Python 代码字符串,然后在 exec() 语句中运行它们。如果运行任意代码的时间超过某个预定限制,则 exec() 语句需要退出,并且需要设置 bool 标志以指示已发生过早退出。

如何实现?

附加信息

这些代码片段将在多个线程中并行运行(或者至少与 GIL 一样并行)。

如果有另一种语言的替代方法,我愿意尝试。

我计划清理代码以防止访问任何可能意外损坏我的系统的内容(文件和系统访问、导入语句、对 exec() 或 eval() 的嵌套调用等)。

我考虑过的选项

  1. 由于 exec() 语句在线程中运行,因此使用毒丸来终止线程。不幸的是,我读到毒丸并不适用于所有情况。
  2. 在进程内运行 exec() 语句,然后使用 process.terminate() 终止一切。但是我在 Windows 上运行并且我读到进程创建可能很昂贵。它还使与管理所有这些的代码的通信变得复杂。
  3. 只允许在 exec() 语句中使用预先编写的函数,并让这些函数定期检查退出标志,然后根据需要执行清理。这很复杂,耗时,而且需要考虑的极端情况太多;我正在寻找更简单的解决方案。

我知道这是一个有点古怪的问题,值得“为什么你会想要允许任意代码在 exec() 语句中运行?”响应类型。我正在尝试一些 self 进化的代码。这是我目前的主要绊脚石:如果你允许你的代码做几乎任何事情,那么它可能会永远挂起。您如何重新获得控制并在它发生时阻止它?

最佳答案

这不是一个非常详细的答案,但它超出了我想在评论中添加的内容。

对于 creating functions with timeouts, using multiprocessing,您可能需要考虑类似的其他问题作为开始。

线程的问题是您可能无法使用您的毒丸 方法,因为它们不是执行许多小任务的 worker 。他们会坐在那里阻止发表声明。它永远不会获得退出的值(value)。

您提到您担心在 Windows 上使用进程是因为它们很昂贵。所以你可以做的是创建你自己的进程池(进程列表)。它们都是从一个队列中拉取的,而你向队列中提交新的任务。如果任何进程超过超时时间,您将杀死它,并在池中用一个新进程替换它。这样一来,您就可以将创建新流程的开销限制在它们超时时,而不是为每个任务都创建一个新流程。

关于python - 转义任意代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270021/

相关文章:

python - 如果我不知道错误在哪里,如何将 Python 错误打印到 txt 文件

python - CX_Freeze 可执行文件给出 "unable to load file system codec"错误

python - 从python中的单个脚本运行多个脚本

python - 如何将 Sprite 从矩形更改为图像?

SQL 更新查询中的 Python 变量

mysql - 定期进行网络抓取,以抓取自上次运行以来网站上的新信息

python - 使用 Python 检查 Windows 服务是否存在

python - xlsxwriter 创建的损坏的 xlsx 文件

python - 我在为模板渲染动态数据时遇到问题

html - python color entire pandas dataframe rows 基于列值