一个轻量级的框架,可以将Python 3.x代码打包成协同仿真FMU。
项目描述
PythonFMU
一个轻量级的框架,可以将Python 3代码或CSV文件打包成协同仿真FMU(遵循FMI版本2.0)。
如何从Python代码构建FMU?
- 安装
pythonfmu
包
pip install pythonfmu
- 创建一个新的类,该类扩展了在
pythonfmu.fmi2slave
模块中声明的Fmi2Slave
类(以下是一个示例)。 - 运行
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脚本依赖于非内置库,如numpy
、scipy
等。 PythonFMU不会在FMU中打包完整的环境。但是,您可以根据以下步骤在FMU中打包requirements.txt
或environment.yml
文件
- 安装pythonfmu包:
pip install pythonfmu
- 创建一个新的类,该类扩展了在
pythonfmu.fmi2slave
模块中声明的Fmi2Slave
类(以下是一个示例)。 - 创建一个
requirements.txt
文件(用于 pip 管理器)和一个environment.yml
文件(用于 conda 管理器),以定义您的依赖项。 - 运行
pythonfmu build -f myscript.py requirements.txt
以创建包含依赖文件的 fmu。
使用 pythonfmu deploy
,最终用户将能够更新其本地 Python 环境。实现此目的的步骤
- 安装pythonfmu包:
pip install pythonfmu
- 确保您处于要更新的 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!
出版物
致谢
这项工作得以实现,得益于以下人员的贡献
@markaren 来自 NTNU-IHB
@fcollonval 来自 Safran SA。
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。