跳转到主要内容

一个轻量级的框架,可以将Python 3.x代码打包成协同仿真FMU。

项目描述

PythonFMU

一个轻量级的框架,可以将Python 3代码或CSV文件打包成协同仿真FMU(遵循FMI版本2.0)。

License: MIT contributions welcome

CI PyPI Conda Version

Gitter

如何从Python代码构建FMU?

  1. 安装pythonfmu
pip install pythonfmu
  1. 创建一个新的类,该类扩展了在pythonfmu.fmi2slave模块中声明的Fmi2Slave类(以下是一个示例)。
  2. 运行pythonfmu build来创建FMU。
usage: pythonfmu build [-h] -f SCRIPT_FILE [-d DEST] [--doc DOCUMENTATION_FOLDER] [--no-external-tool]
                       [--no-variable-step] [--interpolate-inputs] [--only-one-per-process] [--handle-state]
                       [--serialize-state] [--use-memory-management]
                       [Project files [Project files ...]]

Build an FMU from a Python script.

positional arguments:
  Project files         Additional project files required by the Python script.

optional arguments:
  -h, --help            show this help message and exit
  -f SCRIPT_FILE, --file SCRIPT_FILE
                        Path to the Python script.
  -d DEST, --dest DEST  Where to save the FMU.
  --doc DOCUMENTATION_FOLDER
                        Documentation folder to include in the FMU.
  --no-external-tool    If given, needsExecutionTool=false
  --no-variable-step    If given, canHandleVariableCommunicationStepSize=false
  --interpolate-inputs  If given, canInterpolateInputs=true
  --only-one-per-process
                        If given, canBeInstantiatedOnlyOncePerProcess=true
  --handle-state        If given, canGetAndSetFMUstate=true
  --serialize-state     If given, canSerializeFMUstate=true

如何从具有第三方依赖项的Python代码构建FMU?

通常,Python脚本依赖于非内置库,如numpyscipy等。 PythonFMU不会在FMU中打包完整的环境。但是,您可以根据以下步骤在FMU中打包requirements.txtenvironment.yml文件

  1. 安装pythonfmu包:pip install pythonfmu
  2. 创建一个新的类,该类扩展了在pythonfmu.fmi2slave模块中声明的Fmi2Slave类(以下是一个示例)。
  3. 创建一个 requirements.txt 文件(用于 pip 管理器)和一个 environment.yml 文件(用于 conda 管理器),以定义您的依赖项。
  4. 运行 pythonfmu build -f myscript.py requirements.txt 以创建包含依赖文件的 fmu。

使用 pythonfmu deploy,最终用户将能够更新其本地 Python 环境。实现此目的的步骤

  1. 安装pythonfmu包:pip install pythonfmu
  2. 确保您处于要更新的 Python 环境。然后执行 pythonfmu deploy -f my.fmu
usage: pythonfmu deploy [-h] -f FMU [-e ENVIRONMENT] [{pip,conda}]

Deploy a Python FMU. The command will look in the `resources` folder for one of the following files:
`requirements.txt` or `environment.yml`. If you specify a environment file but no package manager, `conda` will be selected for `.yaml` and `.yml` otherwise `pip` will be used. The tool assume the Python environment in which the FMU should be executed is the current one.

positional arguments:
  {pip,conda}           Python packages manager

optional arguments:
  -h, --help            show this help message and exit
  -f FMU, --file FMU    Path to the Python FMU.
  -e ENVIRONMENT, --env ENVIRONMENT
                        Requirements or environment file.

示例

编写脚本

from pythonfmu import Fmi2Causality, Fmi2Slave, Boolean, Integer, Real, String


class PythonSlave(Fmi2Slave):

    author = "John Doe"
    description = "A simple description"

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.intOut = 1
        self.realOut = 3.0
        self.booleanVariable = True
        self.stringVariable = "Hello World!"
        self.register_variable(Integer("intOut", causality=Fmi2Causality.output))
        self.register_variable(Real("realOut", causality=Fmi2Causality.output))
        self.register_variable(Boolean("booleanVariable", causality=Fmi2Causality.local))
        self.register_variable(String("stringVariable", causality=Fmi2Causality.local))
        
        # Note:
        # it is also possible to explicitly define getters and setters as lambdas in case the variable is not backed by a Python field.
        # self.register_variable(Real("myReal", causality=Fmi2Causality.output, getter=lambda: self.realOut, setter=lambda v: set_real_out(v))

    def do_step(self, current_time, step_size):
        return True

创建 FMU

pythonfmu build -f pythonslave.py myproject

在这个示例中,一个名为 PythonSlave 的 Python 类被声明在名为 pythonslave.py 的文件中,其中 myproject 是一个可选文件夹,包含 Python 脚本所需的额外项目文件。此类项目文件夹将被递归复制到 FMU 中。可以添加多个项目文件/文件夹。

注意

PythonFMU 不捆绑 Python,这使得它成为一个耦合解决方案的工具。这意味着您不能期望生成的 FMU 在不同的系统上运行(该系统需要兼容的 Python 版本和库)。但是为了便于使用,包装器使用了有限的 Python API,使得为 Linux 和 Windows 64 位预构建的二进制文件与任何 Python 3 环境兼容。如果您需要为特定配置编译包装器,则需要 CMake 和 C++ 编译器。Linux 和 Windows 上构建包装器的命令可以在 GitHub 工作流程 中查看。

PythonFMU 不会自动解析第三方依赖项。如果您的代码包含例如 numpy,则目标系统也需要安装 numpy


您是否想用 Java 构建 FMUs?请查看 FMI4j
需要分发您的 FMUs?请使用 FMU-proxy

出版物

Hatledal, Lars Ivar, Frédéric Collonval, 和 Houxiang Zhang. "Enabling python driven co-simulation models with PythonFMU." Proceedings of the 34th International ECMS-Conference on Modelling and Simulation-ECMS 2020. ECMS European Council for Modelling and Simulation, 2020.

致谢

这项工作得以实现,得益于以下人员的贡献
@markaren 来自 NTNU-IHB
@fcollonval 来自 Safran SA。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

pythonfmu-0.6.5.tar.gz (341.5 kB 查看散列)

上传时间

构建分布

pythonfmu-0.6.5-py3-none-any.whl (356.8 kB 查看散列)

上传时间 Python 3

由以下支持