PythonFMU icon indicating copy to clipboard operation
PythonFMU copied to clipboard

ImportError of a custom script

Open Daveonwave opened this issue 2 years ago • 6 comments

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.

Daveonwave avatar Jan 09 '23 15:01 Daveonwave

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

markaren avatar Jan 09 '23 17:01 markaren

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

Daveonwave avatar Jan 10 '23 09:01 Daveonwave

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

markaren avatar Jan 10 '23 09:01 markaren

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.

Daveonwave avatar Jan 10 '23 10:01 Daveonwave

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?

markaren avatar Jan 11 '23 07:01 markaren

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.

Daveonwave avatar Jan 11 '23 08:01 Daveonwave