NTNU-IHB / PythonFMU

A lightweight framework that enables the packaging of Python3.x code as co-simulation FMUs
MIT License
137 stars 38 forks source link

ImportError of a custom script #169

Open Daveonwave opened 1 year ago

Daveonwave commented 1 year ago

I'm trying to create a fmu of a custom class. My code is structured like this:

from pythonfmu.fmi2slave import Fmi2Slave, Fmi2Causality, Fmi2Variability, Real

try:
    import MyModel as mymodel
    from sympy import symbols, exp
except ImportError:
    symbols, exp, mymodel = None, None, None

class MyFmu(Fmi2Slave):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.input_var = 0.
        self.output_var = 0.

        self.model = mymodel.ModelClass(...)

        self.register_variable(Real('input_var', causality=Fmi2Causality.input))
        self.register_variable(Real('output_var', causality=Fmi2Causality.output))

    def do_step(self, current_time, step_size) -> bool:
        self.output_var = self.model.step(...)
        return True

I followed the sympyslave.py structure to declare the imports, even if I don't plan to use sympy.

My problem is related to the import of MyModel.py script, which is a custom script that I would like to wrap with fmu.

I'm trying to export the fmu with this command pythonfmu build -f MyFmu.py MyModel.py because I'm considering MyModel.py as a project file, but it's not working since I'm getting the error AttributeError: 'NoneType' object has no attribute 'Model'.

Am I missing something or is it just unfeasible to import a custom class in this way? Thanks in advance for the help.

markaren commented 1 year ago

Do you have sympy installed? Otherwise the code would raise an ImportError (and mymodel set to None)...

Daveonwave commented 1 year ago

Yes, sympy is correctly installed and I also tried to comment out lines of code related to sympy import. In both cases I still get the ImportError

markaren commented 1 year ago

You could try debugging the issue by extracting the FMU content and run the Python code directly (as any othe python code).

Daveonwave commented 1 year ago

Thanks, calling the build_FMU method of FmuBuilder class it seems to work even without declaring additional project files and the output of the simulation is the expected one.

markaren commented 1 year ago

Oh, you got the error while exporting the FMU.... And it works when doing it programatically. Are you sure you were using the same python environment for both cases?

Daveonwave commented 1 year ago

Sure, I double checked it again just to be sure, but the python interpreter/version is the same (Python 3.8) and I didn't create a venv, so packages match perfectly.