Unable to use Steps, generated with Python Plugin in example from `TapApiFromPython`

I was trying to run the example from “TapApiFromPython/Misc Examples/DynamicallyGenerateTestPlan.py”, which I reworked to support python3.
It works fine with built-in BasicSteps but I can’t add my steps, generated by Python Plugin.
(I can use my steps in TUI)

I always get “System.NullReferenceException: Object reference not set to an instance of an object.”.

example of code:

import sys
import clr
import os
from pathlib import Path

tapPath = Path(os.environ["TAP_PATH"])
basic_steps_tapPath = tapPath / "Packages" / "OpenTAP"
my_steps_tapPath = tapPath / "Packages" / "Python" / "my_tap"



import OpenTap
import OpenTap.Plugins.BasicSteps as BasicSteps
import Keysight.OpenTap.Plugins.Python as PythonPlugin
import Python.my_tap as MySteps

# Required to find plugins
print("Test Plan Started.")


myTestPlan = OpenTap.TestPlan()
mySequenceStep = BasicSteps.SequenceStep()

# myTestPlan.Name = "MyTestplan"
# TestPlan.Name doesn't have a setter anymore

myDelayStep1 = BasicSteps.DelayStep()
myDelayStep1.DelaySecs = 2.5
myDelayStep1.Name = "Delay1"

myDelayStep2 = BasicSteps.DelayStep()
myDelayStep2.DelaySecs = 1.1
myDelayStep2.Name = "Delay2"

myStep = MySteps.RegularStep()  # OUTPUT: System.NullReferenceException: Object reference not set to an instance of an object.
myStep.Name = "Regular Step 1"




print(f"Test Plan Ended.")
1 Like

@geomags123 Welcome to the community!

Which version of the Python Plugin are you using?

I think it is easiest if you have this script in the same directory as your custom steps, but @rolf_madsen, @ivan.diep , or @arvind.sundararajan may have a better idea.

@brennen_direnzo I have Python Plugin version 2.2.0.

But the issue is not that I can’t open Python.my_tap.dll. I can import it and even print the type of steps I created.

# OUTPUT: <class 'Python.my_tap.MyStep'>
# OUTPUT: <class 'CLR.CLR Metatype'>

but when I try to create an object of this step I get the error:

my_step = MySteps.MyStep()
# System.NullReferenceException: Object reference not set to an instance of an object.
#    at Keysight.OpenTap.Plugins.Python.PythonStepWrapper.load(String name, String moduleName)

Are you trying to create a TestPlan in code? Just wondering why you’re trying to instantiate a TestStep, I don’t think it’s the usual use model. Usually you’d create your TestStep classes in code, and then use those to create a TestPlan in the Editor. My point is - you may be trying something in Python that no one has tried before, not sure. Perhaps there’s some functionality missing.

Also, why try to use the compiled version? I think also the intention with Python is to use the Python classes and then “transpile” them. So your Python would reference your Python code as opposed to your compiled dll. I don’t disagree that you should be able to do it the way you’re trying to do it, I just think you’re running up against the use model here and may be why you’re having trouble. But like I said, that may also explain why there’s functionality missing or a bug, if that’s the case.

@john.berlien thank you for the response :slight_smile:
Basically, the idea is to generate OpenTap Test Plan automatically using Python and Tap API.
I think I’m not the first one who’s trying to achieve it because I use just a slightly reworked example from the OpenTap Python Plugin repo (link) which was created by @rolf_madsen for Python 2.

Okay I see. Have you tried building a plugin in Visual Studio and then used in Python this way?

@john.berlien no, usually I build plugins using tap python build <plugin_name>. Is there any difference?

Sorry I mean building a C# plugin in Visual Studio.

Hi @geomags123 ,

We don’t support inserting python-defined test steps directly in a test plan, they need to be wrapped first, that is why we have the build step. If you can get a reference to the C# wrapper type it should work.

You probably need to import a module called Python.[ModuleName] and then find your types in there.

@rolf_madsen not sure I understood everything properly but I inserted python steps exactly after wrapping them with tap python build <ModuleName> as you said.

And also I imported the module you said:

import Python.my_tap as MySteps
myStep = MySteps.RegularStep()

Is this what you were talking about? Or did you mean another wrapper?

Ah sorry, I though I understood what the problem was. Seems not so.

Can you provide the stacktrace from that exception? It seems like something may have to be initialized before you can do that.


Traceback (most recent call last):
  File "c:/Program Files/OpenTAP/Packages/Python/test_GenerateTestPlan.py", line 33, in <module>
    myStep = MySteps.myRegularStep()
System.NullReferenceException: Object reference not set to an instance of an object.
   at Keysight.OpenTap.Plugins.Python.PythonStepWrapper.load(String name, String moduleName)
   at Python.tap.myRegularStep.load_instance()
   at Keysight.OpenTap.Plugins.Python.PythonStepWrapper..ctor()
   at Python.tap.BaseTestStep..ctor()
Fatal Python error: auto-releasing thread-state, but no thread-state for this thread

OK, thanks, so I guess the exception comes from this code: Keysight.OpenTap.Plugins.Python/SDK/PythonStepWrapper.cs · master · OpenTAP / Plugins / python · GitLab

I have no idea why it occurs though - I cannot immediately see any problem here.

Can you open an issue at Issues · OpenTAP / Plugins / python · GitLab with this information?