【问题标题】:Run external Python script that could only read/write only a subset of main app variables运行只能读取/写入主要应用程序变量子集的外部 Python 脚本
【发布时间】:2018-11-09 16:42:21
【问题描述】:

我有一个 Python 应用程序可以模拟系统的行为,比如汽车。

该应用程序定义了一组相当大的变量,其中一些对应于现实世界的参数(剩余燃料量、汽车速度等),而另一些则与用户不感兴趣的模拟器内部机制相关。

一切正常,但目前用户在模拟执行期间无法与模拟进行任何交互:她只是设置模拟参数,启动模拟,然后等待其终止。

我希望用户(即应用程序的创建者)能够在应用程序之外编写 Python 脚本,以读取/写入与现实世界相关的变量参数(并且只有这些变量)。

例如,在 t=23s(这个条件我知道如何检查),我想执行用户脚本 gasLeak.py,读取剩余燃料值并将其设置为当前值的一半。

总而言之,如何从 Python 主应用程序执行用户编写的 Python 脚本,这些脚本只能访问和修改主脚本变量的预定义子集。 在一个完美的世界,我还希望在应用程序运行期间应用到用户脚本的修改被考虑在内,而不必重新启动所述应用程序(沿着模块的reloading 的东西)。

【问题讨论】:

    标签: python namespaces interpreter


    【解决方案1】:

    让用户编写的脚本读取命令行参数并打印到stdout。然后,您可以使用 subprocess 模块调用他们,并使用他们需要了解的变量作为参数,并使用 subprocess.check_output 读取他们的响应。

    【讨论】:

      【解决方案2】:

      这样做的一种方法是将应用程序属性封装在一个类中,并使您想要对用户隐藏的变量“私有”,或者更确切地说是伪私有,因为 Python 没有真正的访问修饰符。您可以通过使用下划线有效地实现变量私有化。看到这个post. 被设为“私有”的变量将无法在类定义之外访问,因此它们将从您的用户脚本中隐藏。

      【讨论】:

      • 在您建议的解决方案中,用户脚本在应用程序“内部”执行,就像程序员编写的文件中的代码一样,这是否正确?
      • 在我的场景中从哪里运行用户脚本并不重要。对于定义私有数据的类之外的任何东西,私有数据将是不可访问的。这将包括不在类中的其他模块、其他类和用户定义的脚本。
      猜你喜欢
      • 2012-03-08
      • 2021-08-12
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      相关资源
      最近更新 更多