I just tried this with Python 3.14 The documentation clearly says it only supports up to 3.10.
I hate to do this, but I asked Claude and it came up with a fix that seems to work.
Here is the output. I just replaced the current for loop starting on line 203 with this for loop and it seems to work.
Looking at the source code, I can see the exact problem. In _Instrument.init, the exec(_funExecStr) call creates the _FunctionXxx class inside the method's local scope, but then exec(_execString) tries to reference it — and it's not visible there.
This is a Python 3.12+ scoping change where exec() inside a method can no longer "see" names created by a previous exec() in the same scope.
The fix is to use an explicit local dict and pass it between both exec() calls:
pythonclass _Instrument:
def __init__(self, _instrumentName, _functionClusters):
self.name = _instrumentName
for _functionCluster in _functionClusters:
_functionName = _functionCluster[0]
_functionArgList = _functionCluster[1]
_functionDoc = _functionCluster[2]
_funExecStr = _scriptFuncClass(_functionName, _functionArgList, _functionDoc)
_local_ns = {} # <-- shared namespace
exec(_funExecStr, globals(), _local_ns) # <-- define class into it
_execString = (
'self.' + _functionName +
' = _Function' + _functionName +
"('" + _instrumentName + '.' + _functionName + "'," +
repr(_functionArgList) + ')'
)
_local_ns['self'] = self # <-- make self available
exec(_execString, globals(), _local_ns) # <-- reference class from same ns
To apply the fix:
Since labview.py is inside your venv's site-packages, you can edit it directly:
C:\Users\SAS\Desktop\pybridge\venv\Lib\site-packages\jki_python_bridge_for_labview\labview.py
Find the _Instrument.init method (around line 207) and replace those four lines inside the for loop with the version above.
Why this broke in newer Python: Python 3.12 tightened exec() scoping — classes/names defined by one exec() call are no longer implicitly visible to a subsequent exec() in the same function. The JKI bridge was written for Python 3.6–3.10 (stated in the file header) and never accounted for this. Passing an explicit shared _local_ns dict to both calls is the correct fix.
I just tried this with Python 3.14 The documentation clearly says it only supports up to 3.10.
I hate to do this, but I asked Claude and it came up with a fix that seems to work.
Here is the output. I just replaced the current for loop starting on line 203 with this for loop and it seems to work.
Looking at the source code, I can see the exact problem. In _Instrument.init, the exec(_funExecStr) call creates the _FunctionXxx class inside the method's local scope, but then exec(_execString) tries to reference it — and it's not visible there.
This is a Python 3.12+ scoping change where exec() inside a method can no longer "see" names created by a previous exec() in the same scope.
The fix is to use an explicit local dict and pass it between both exec() calls:
To apply the fix:
Since labview.py is inside your venv's site-packages, you can edit it directly:
C:\Users\SAS\Desktop\pybridge\venv\Lib\site-packages\jki_python_bridge_for_labview\labview.py
Find the _Instrument.init method (around line 207) and replace those four lines inside the for loop with the version above.
Why this broke in newer Python: Python 3.12 tightened exec() scoping — classes/names defined by one exec() call are no longer implicitly visible to a subsequent exec() in the same function. The JKI bridge was written for Python 3.6–3.10 (stated in the file header) and never accounted for this. Passing an explicit shared _local_ns dict to both calls is the correct fix.