ni / ni/nimi-python

Calling nidmm.Session.read() prior to initializing a switch causes "undefined symbol: niSwitch_InitWithTopology" on Linux

Open
#1,480 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
128
Forks
110
Avg merge
5d 14h
Merged PRs (30d)
10

Description

Description of issue

Running the following code on CentOS 7.6 results in an unexpected traceback:

import niswitch
import nidmm
with nidmm.Session("PXI1Slot2", reset_device=True, options={
    'simulate': True, 'driver_setup': { 'Model': '4070', 'BoardType': 'PXI'}}) as dmmS:
    dmmS.configure_measurement_digits(nidmm.Function.TWO_WIRE_RES, -1, 5.5)
    dmmS.read()
    with niswitch.Session('', '2737/2-Wire 4x64 Matrix', True, True) as bridgeS:
        pass
    pass

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
  File "/home/nitest/ni_venv35/lib64/python3.5/site-packages/niswitch/session.py", line 1454, in __init__
    self._vi = self._init_with_topology(resource_name, topology, simulate, reset_device)
  File "/home/nitest/ni_venv35/lib64/python3.5/site-packages/niswitch/session.py", line 2165, in _init_with_topology
    error_code = self._library.niSwitch_InitWithTopology(resource_name_ctype, topology_ctype, simulate_ctype, reset_device_ctype, None if vi_ctype is None else (ctypes.pointer(vi_ctype)))
  File "/home/nitest/ni_venv35/lib64/python3.5/site-packages/niswitch/_library.py", line 216, in niSwitch_InitWithTopology
    self.niSwitch_InitWithTopology_cfunc = self._library.niSwitch_InitWithTopology
  File "/opt/rh/rh-python35/root/usr/lib64/python3.5/ctypes/__init__.py", line 355, in __getattr__
    func = self.__getitem__(name)
  File "/opt/rh/rh-python35/root/usr/lib64/python3.5/ctypes/__init__.py", line 360, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: python: undefined symbol: niSwitch_InitWithTopology

If the order is changed, the error does not occur:

import niswitch
import nidmm
with niswitch.Session('', '2737/2-Wire 4x64 Matrix', True, True) as bridgeS:
    with nidmm.Session("PXI1Slot2", reset_device=True, options={
        'simulate': True, 'driver_setup': { 'Model': '4070', 'BoardType': 'PXI'}}) as dmmS:
        dmmS.configure_measurement_digits(nidmm.Function.TWO_WIRE_RES, -1, 5.5)
        dmmS.read()
    pass

This behavior has been confirmed on CentOS 7.6 with python 3.5.1 and python 3.6.9. These are installed via software collections as below:

yum install centos-release-scl
yum install rh-python36 rh-python36-python-virtualenv
scl enable rh-python36 bash

The error does not occur on Windows 10 x64 with python 3.6 or python 3.7.

System report

From the python 3.6.9 virtualenv:

python -c "import niswitch; import nidmm; niswitch.print_diagnostic_information(); nidmm.print_diagnostic_information()"" output

```
OS:
    Name:      Linux
    Version:   #1 SMP Thu Nov 29 14:49:43 UTC 2018
    Bits:      64
Driver:
    Name:      NI-SWITCH
    Version:   Unknown
Module:
    Name:      niswitch
    Version:   1.3.0
Python:
    Version:   3.6.9 (default, Nov 11 2019, 11:24:16) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
    Bits:      64
    Is_Venv:   True
    Installed Packages:
        zipp==3.1.0
        wcwidth==0.2.3
        six==1.15.0
        setuptools==36.5.0
        pytest==5.4.3
        pyparsing==2.4.7
        py==1.8.1
        pluggy==0.13.1
        pip==9.0.1
        packaging==20.4
        niswitch==1.3.0
        nidmm==1.3.0
        more-itertools==8.3.0
        importlib-metadata==1.6.0
        hightime==0.2.0
        attrs==19.3.0
OS:
    Name:      Linux
    Version:   #1 SMP Thu Nov 29 14:49:43 UTC 2018
    Bits:      64
Driver:
    Name:      NI-DMM
    Version:   Unknown
Module:
    Name:      nidmm
    Version:   1.3.0
Python:
    Version:   3.6.9 (default, Nov 11 2019, 11:24:16) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
    Bits:      64
    Is_Venv:   True
    Installed Packages:
        zipp==3.1.0
        wcwidth==0.2.3
        six==1.15.0
        setuptools==36.5.0
        pytest==5.4.3
        pyparsing==2.4.7
        py==1.8.1
        pluggy==0.13.1
        pip==9.0.1
        packaging==20.4
        niswitch==1.3.0
        nidmm==1.3.0
        more-itertools==8.3.0
        importlib-metadata==1.6.0
        hightime==0.2.0
        attrs==19.3.0
```
Steps to reproduce issue

See the example code in the description.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The traceback points to niswitch/session.py and niswitch/_library.py; start by reproducing the CentOS Linux example with nidmm.Session.read() before niswitch.Session(). Compare this order with the working reversed-order example and verify that switch initialization no longer raises the undefined-symbol error.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.