ansys / pyaedt

AEDT Python Client Package
https://aedt.docs.pyansys.com
MIT License
197 stars 116 forks source link

grpc error raised using IronPython desktop object #4514

Closed daneansys closed 4 months ago

daneansys commented 4 months ago

Before submitting the issue

Description of the bug

When attempting to use IronPython commands in PyAEDT, a grpc error is invoked on line:

oProject = dt.GetActiveProject()

with traceback to grpc_plugin.py

Steps To Reproduce

using PyAEDT v0.8.8 Start with an open HFSS project in AEDT (I've tried 2024R1 and 2024R2) Open the PyAEDT console under Automation > PyAEDT > Console Paste the following code into the console:

version = '2024.2'
import pyaedt

desktop = Desktop(
    specified_version=version,
    new_desktop_session=False,
    non_graphical=False,
    close_on_exit=False,
    student_version=False,
)

dt = desktop.odesktop
oProject = dt.GetActiveProject() # The script fails on this line, but only sometimes.  Traceback to grpc_plugin.py
desktop.release_desktop(False, False)

The first time, the code will usually run. Paste and execute the code a few more times until it fails. Once it fails, a pattern of working, then failing every other time can be observed.

The error is:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
File ~\AppData\Roaming\pyaedt_env_ide\v242\lib\site-packages\pyaedt\generic\grpc_plugin.py:120, in AedtObjWrapper.__Invoke__(self, funcName, argv)
    119 try:
--> 120     return _retry_ntimes(
    121         settings.number_of_grpc_api_retries, AedtAPI.InvokeAedtObjMethod, self.objectID, funcName, argv
    122     )  # Call C function
    123 except Exception:  # pragma: no cover

File ~\AppData\Roaming\pyaedt_env_ide\v242\lib\site-packages\pyaedt\generic\general_methods.py:833, in _retry_ntimes(n, function, *args, **kwargs)
    832 if "__name__" in dir(function):
--> 833     raise AttributeError("Error in Executing Method {}.".format(function.__name__))
    834 else:

AttributeError: Error in Executing Method InvokeAedtObjMethod.

During handling of the above exception, another exception occurred:

GrpcApiError                              Traceback (most recent call last)
Cell In[5], line 13
      4 desktop = Desktop(
      5     specified_version=version,
      6     new_desktop_session=False,
   (...)
      9     student_version=False,
     10 )
     12 dt = desktop.odesktop
---> 13 oProject = dt.GetActiveProject() # Every other time, the script fails on this line.  Traceback to grpc_plugin.py
     14 desktop.release_desktop(False, False)

File ~\AppData\Roaming\pyaedt_env_ide\v242\lib\site-packages\pyaedt\generic\grpc_plugin.py:133, in AedtObjWrapper.__GetObjMethod__.<locals>.DynamicFunc(self, *args)
    132 def DynamicFunc(self, *args):
--> 133     return self.__Invoke__(funcName, args)

File ~\AppData\Roaming\pyaedt_env_ide\v242\lib\site-packages\pyaedt\generic\grpc_plugin.py:124, in AedtObjWrapper.__Invoke__(self, funcName, argv)
    120     return _retry_ntimes(
    121         settings.number_of_grpc_api_retries, AedtAPI.InvokeAedtObjMethod, self.objectID, funcName, argv
    122     )  # Call C function
    123 except Exception:  # pragma: no cover
--> 124     raise GrpcApiError("Failed to execute grpc AEDT command: {}".format(funcName))

GrpcApiError: Failed to execute grpc AEDT command: GetActiveProject

The application is a customer using a mix of PyAEDT and IronPython commands all within the PyAEDT environment.

Which Operating System are you using?

Windows

Which Python version are you using?

3.10

Installed packages

annotated-types==0.6.0 ansys-pythonnet==3.1.0rc3 anyio==4.3.0 argon2-cffi==23.1.0 argon2-cffi-bindings==21.2.0 arrow==1.3.0 asttokens==2.4.1 async-lru==2.0.4 attrs==23.2.0 Babel==2.14.0 beautifulsoup4==4.12.3 bleach==6.1.0 certifi==2024.2.2 cffi==1.16.0 charset-normalizer==3.3.2 click==8.1.7 click-plugins==1.1.1 cligj==0.7.2 clr-loader==0.2.6 colorama==0.4.6 comm==0.2.2 contourpy==1.2.1 cycler==0.12.1 debugpy==1.8.1 decorator==5.1.1 defusedxml==0.7.1 et-xmlfile==1.1.0 exceptiongroup==1.2.0 executing==2.0.1 fastjsonschema==2.19.1 fiona==1.9.6 fonttools==4.51.0 fpdf2==2.7.8 fqdn==1.5.1 geopandas==0.14.3 h11==0.14.0 httpcore==1.0.5 httpx==0.27.0 idna==3.7 imageio==2.34.0 ipycanvas==0.13.1 ipyevents==2.0.2 ipykernel==6.29.4 ipython==8.23.0 ipython-genutils==0.2.0 ipyvtklink==0.2.3 ipywidgets==7.8.1 isoduration==20.11.0 jedi==0.19.1 Jinja2==3.1.3 json5==0.9.25 jsonpointer==2.4 jsonschema==4.21.1 jsonschema-specifications==2023.12.1 jupyter-events==0.10.0 jupyter-lsp==2.2.5 jupyter_client==8.6.1 jupyter_core==5.7.2 jupyter_server==2.14.0 jupyter_server_terminals==0.5.3 jupyterlab==4.1.6 jupyterlab-widgets==1.1.7 jupyterlab_pygments==0.3.0 jupyterlab_server==2.26.0 kiwisolver==1.4.5 MarkupSafe==2.1.5 matplotlib==3.8.4 matplotlib-inline==0.1.7 mistune==3.0.2 nbclient==0.10.0 nbconvert==7.16.3 nbformat==5.10.4 nest-asyncio==1.6.0 networkx==3.3 notebook==7.1.2 notebook_shim==0.2.4 numpy==1.26.4 openpyxl==3.1.2 osmnx==1.9.2 overrides==7.7.0 packaging==24.0 pandas==2.2.2 pandocfilters==1.5.1 parso==0.8.4 pillow==10.3.0 platformdirs==4.2.0 plumbum==1.8.2 pooch==1.8.1 prometheus_client==0.20.0 prompt-toolkit==3.0.43 psutil==5.9.8 pure-eval==0.2.2 pyaedt==0.8.8 pycparser==2.22 pydantic==2.6.4 pydantic_core==2.16.3 pyedb==0.7.1 Pygments==2.17.2 pyparsing==3.1.2 pyproj==3.6.1 python-dateutil==2.9.0.post0 python-json-logger==2.0.7 pytomlpp==1.0.13 pytz==2024.1 pyvista==0.43.5 pywin32==306 pywinpty==2.0.13 PyYAML==6.0.1 pyzmq==26.0.0 referencing==0.34.0 requests==2.31.0 rfc3339-validator==0.1.4 rfc3986-validator==0.1.1 rpds-py==0.18.0 rpyc==6.0.0 scikit-rf==0.32.0 scipy==1.13.0 scooby==0.9.2 Send2Trash==1.8.3 shapely==2.0.3 six==1.16.0 sniffio==1.3.1 soupsieve==2.5 SRTM.py==0.3.7 stack-data==0.6.3 terminado==0.18.1 tinycss2==1.2.1 toml==0.10.2 tomli==2.0.1 tornado==6.4 traitlets==5.14.2 types-python-dateutil==2.9.0.20240316 typing_extensions==4.11.0 tzdata==2024.1 uri-template==1.3.0 urllib3==2.2.1 utm==0.7.0 vtk==9.2.6 wcwidth==0.2.13 webcolors==1.13 webencodings==0.5.1 websocket-client==1.7.0 widgetsnbextension==3.6.6

Samuelopez-ansys commented 4 months ago

Hi @daneansys ,

I have installed from scratch (delete the previous virtual environment v241, remote Toolkit PersonalLib folder) then I have installed again PyAEDT using the script from the documentation, and everything works:

image

Samuelopez-ansys commented 4 months ago

It even works with Ironpython (having PyAEDT inside the PersonalLib):

image

FYI, IronPython compatibility is deprecated, so we do not suggest using PyAEDT and IronPython.

daneansys commented 4 months ago

@Samuelopez-ansys, yes, it works the first time. Try pasting the whole code into the command prompt several times. It will usually fail on the 2nd try, succeed on the 3rd, fail on the 4th, succeed on the 5th, etc.

Of course IronPython is not recommended, but a customer is using a code base they have built up over time, which uses a mixture of native PyAEDT commands and IronPython.

version = '2024.2'
import pyaedt

desktop = Desktop(
    specified_version=version,
    new_desktop_session=False,
    non_graphical=False,
    close_on_exit=False,
    student_version=False,
)

dt = desktop.odesktop
oProject = dt.GetActiveProject() # The script fails on this line, but only sometimes.  Traceback to grpc_plugin.py
desktop.release_desktop(False, False)
Samuelopez-ansys commented 4 months ago

Hi @daneansys ,

I think we fixed the issue on this PR: #4530

The problem is not 100% PyAEDT or AEDT, it is Python and how internally works at the memory cache level. If you run this code it should work with the new PyAEDT main:

version = '2024.1'
import pyaedt

for i in range(0, 10):
    print(str(i))
    desktop = pyaedt.Desktop(
        specified_version=version,
        new_desktop_session=False,
        non_graphical=False,
        close_on_exit=False,
        student_version=False,
    )

    oProject = desktop.odesktop.GetActiveProject()
    desktop.release_desktop(False, False)

If you save in a variable "desktop" like: dt = desktop.odesktop

You will have the same problem, and you will need to delete it, for that reason the previous code is better because I did not save in a variable the object.

version = '2024.1'
import pyaedt

for i in range(0, 10):
    print(str(i))
    desktop = pyaedt.Desktop(
        specified_version=version,
        new_desktop_session=False,
        non_graphical=False,
        close_on_exit=False,
        student_version=False,
    )
    dt = desktop.odesktop
    oProject = dt.GetActiveProject()
    desktop.release_desktop(False, False)
    dt = None
daneansys commented 4 months ago

Hi @Samuelopez-ansys,

Thank you for deciphering a workaround. Running either of the below repetitively in the command prompt work:

desktop = Desktop(
    specified_version=version,
    new_desktop_session=False,
    non_graphical=False,
    close_on_exit=False,
    student_version=False,
)
oProject = desktop.odesktop.GetActiveProject()
desktop.release_desktop(False, False)

OR

desktop = Desktop(
    specified_version=version,
    new_desktop_session=False,
    non_graphical=False,
    close_on_exit=False,
    student_version=False,
)
dt = desktop.odesktop
oProject = dt.GetActiveProject()
dt = None
desktop.release_desktop(False, False)

The original code block, when run repetitively, still fails every other time, but you stated that is an issue with Python caching. So this method should not be run:

desktop = Desktop(
    specified_version=version,
    new_desktop_session=False,
    non_graphical=False,
    close_on_exit=False,
    student_version=False,
)
dt = desktop.odesktop
oProject = dt.GetActiveProject() # The script fails on this line, every other time.  Traceback to grpc_plugin.py
desktop.release_desktop(False, False)
Samuelopez-ansys commented 4 months ago

@daneansys could we close the issue?

daneansys commented 4 months ago

@Samuelopez-ansys, yes! Thank you! I see the "Close with comment" option, so will try that. Hopefully that is the right place to close.