Love pylablib!Used it to program my Hamamatsu cam successfully, but encountered BaslerLibError with my Basler cam while establishing connection.
my system
I use pylablib 1.4.3 + python 3.12, windows 10, and pylon 8. However the same Exception can be produced with pylon 7, pylon 25, and with different computers. So this seems like a general problem.
things that work
Before posting this issue, I have followed the pylablib basler doc to make the pylon-emulated camera work correctly. But I cannot use the same steps to get my real camera working. I could grab frames using this basler cam with pypylon, the official basler python tool.
minimal reproduciple example
To produce the exception, I use the following minimal code:
import pylablib as pll
pll.par["devices/dlls/basler_pylon"] = r"D:\basler camera\Runtime\x64\PylonC_v9.dll" # my PylonC path
from pylablib.devices import Basler
caminfo, = Basler.list_cameras()
print(caminfo) # this works
with Basler.BaslerPylonCamera() as cam: # this produces BalserLibError, so does `cam = Basler.BaslerPylonCamera()`
print('hello world')
The print(caminfo) tells me my cam model (acA4024-29um, a usb cam) as shown below. This should mean that I loaded the PythonC runtime correctly:
TCameraInfo(name='\\\\?\\usb#vid_2676&pid_ba02&mi_00#7&a46b7ce&0&0000#{79bfeeca-947f-11e1-bc58-001b2163ef96}', model='acA4024-29um', serial='25039266', devclass='BaslerUsb', devversion='109274-02', vendor='Basler', friendly_name='Basler acA4024-29um (25039266)', user_name='', props={'DeviceFactory': 'USB/BaslerUsb 9.1.1.279', 'DeviceGUID': '2676017E11A2', 'DeviceIdx': '0x0', 'InterfaceID': 'DefaultInterface', 'ManufacturerInfo': 'none', 'ProductId': '0xba02', 'SpeedSupportBitmask': '8', 'TLType': 'U3V', 'TransferModeKey': 'btx', 'UsbDriverTypeName': 'BaslerUSB', 'UsbPortVersionBcd': '0x320', 'VendorId': '0x2676'})
But the next line, the with block (or equivalently cam = Basler.BaslerPylonCamera()), gives me a BaslerLibError. I put below the complete error message:
---------------------------------------------------------------------------
BaslerLibError Traceback (most recent call last)
File c:\Users\Tweezer Lab\OneDrive\Desktop\mask_frame_cycle\pylablib_test.py:7
[5](file:///C:/Users/Tweezer%20Lab/OneDrive/Desktop/mask_frame_cycle/pylablib_test.py:5) caminfo, = Basler.list_cameras()
[6](file:///C:/Users/Tweezer%20Lab/OneDrive/Desktop/mask_frame_cycle/pylablib_test.py:6) print(caminfo)
----> [7](file:///C:/Users/Tweezer%20Lab/OneDrive/Desktop/mask_frame_cycle/pylablib_test.py:7) with Basler.BaslerPylonCamera() as cam:
[8](file:///C:/Users/Tweezer%20Lab/OneDrive/Desktop/mask_frame_cycle/pylablib_test.py:8) print('hello world')
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:299, in BaslerPylonCamera.__init__(self, idx, name)
[297](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:297) self._buffer_mgr=None
[298](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:298) self._looper=self.ScheduleLooper()
--> [299](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:299) self.open()
[300](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:300) self._raw_readout_format=False
[301](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:301) self._add_info_variable("device_info",self.get_device_info)
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:329, in BaslerPylonCamera.open(self)
[327](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:327) self.strm=lib.PylonDeviceGetStreamGrabber(self.hdev,0)
[328](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:328) self._opid=libctl.open().opid
--> [329](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:329) self._update_attributes()
[330](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:330) self.post_open()
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\interface\camera.py:1026, in IAttributeCamera._update_attributes(self, replace)
[1024](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/interface/camera.py:1024) def _update_attributes(self, replace=False):
[1025](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/interface/camera.py:1025) """Update ``attributes`` dictionary; if ``replace==True``, replace it entirely, otherwise, simply update it"""
-> [1026](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/interface/camera.py:1026) attrs=self._list_attributes()
[1027](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/interface/camera.py:1027) attrs_dict=dictionary.Dictionary(attrs if isinstance(attrs,dict) else {self._normalize_attribute_name(p.name):p for p in attrs})
[1028](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/interface/camera.py:1028) if replace:
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:356, in BaslerPylonCamera._list_attributes(self)
[354](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:354) nodes=lib.collect_nodes(root,add_branch=False)
[355](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:355) nodes={(n[5:] if n.startswith("Root/") else n):v for n,v in nodes.items()}
--> [356](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:356) attrs=[BaslerPylonAttribute(node,full_name=n) for n,node in nodes.items()]
[357](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:357) for n in self._builtin_attrs:
[358](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:358) node=lib.GenApiNodeMapGetNode(nmap,n)
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:174, in BaslerPylonAttribute.__init__(self, node, full_name)
[172](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:172) self.labels={}
[173](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:173) self.ilabels={}
--> [174](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:174) self._fill_info()
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:185, in BaslerPylonAttribute._fill_info(self)
[183](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:183) nenum=lib.GenApiEnumerationGetNumEntries(self.node)
[184](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:184) self._value_nodes=[lib.GenApiEnumerationGetEntryByIndex(self.node,i) for i in range(nenum)]
--> [185](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:185) self.update_limits()
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylon.py:189, in BaslerPylonAttribute.update_limits(self)
[187](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:187) """Update minimal and maximal attribute limits and return tuple ``(min, max, inc)``"""
[188](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:188) if self.kind=="int":
--> [189](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:189) self.min=lib.GenApiIntegerGetMin(self.node)
[190](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:190) self.max=lib.GenApiIntegerGetMax(self.node)
[191](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylon.py:191) self.inc=lib.GenApiIntegerGetInc(self.node)
File <string>:1, in <lambda>(hNode)
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\core\utils\ctypes_wrap.py:276, in CFunctionWrapper.wrap_annotated.<locals>.wrapped_func(*vargs, **kwargs)
[274](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/core/utils/ctypes_wrap.py:274) return a
[275](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/core/utils/ctypes_wrap.py:275) call_args=[_to_call_arg(n,t,a) for (n,t,a) in zip(argnames,prep_argtypes,func_args)]
--> [276](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/core/utils/ctypes_wrap.py:276) retval=func(*call_args)
[277](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/core/utils/ctypes_wrap.py:277) res=self._convert_results(rvals or [None],dict(zip(argnames,func_args)),retval,kwargs,rconv)
[278](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/core/utils/ctypes_wrap.py:278) if (not self.tuple_single_retval) and len(res)==0:
File d:\miniconda3\envs\tweezeroptim\Lib\site-packages\pylablib\devices\Basler\pylonC_lib.py:47, in errcheck.<locals>.errchecker(result, func, arguments)
[45](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylonC_lib.py:45) def errchecker(result, func, arguments): # pylint: disable=unused-argument
[46](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylonC_lib.py:46) if result not in passing:
---> [47](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylonC_lib.py:47) raise BaslerLibError(func.__name__,result,lib=lib)
[48](file:///D:/miniconda3/envs/tweezeroptim/Lib/site-packages/pylablib/devices/Basler/pylonC_lib.py:48) return result
BaslerLibError: function 'GenApiIntegerGetMin' raised error 0xC2000001(GENAPI_E_FAIL): PylonC error #c2000001 'Failed to get minimum integer value from node.'
Would appreciate any insights about what this exception is about.
Love pylablib!Used it to program my Hamamatsu cam successfully, but encountered
BaslerLibErrorwith my Basler cam while establishing connection.my system
I use pylablib 1.4.3 + python 3.12, windows 10, and pylon 8. However the same Exception can be produced with pylon 7, pylon 25, and with different computers. So this seems like a general problem.
things that work
Before posting this issue, I have followed the pylablib basler doc to make the pylon-emulated camera work correctly. But I cannot use the same steps to get my real camera working. I could grab frames using this basler cam with pypylon, the official basler python tool.
minimal reproduciple example
To produce the exception, I use the following minimal code:
The
print(caminfo)tells me my cam model (acA4024-29um, a usb cam) as shown below. This should mean that I loaded the PythonC runtime correctly:But the next line, the
withblock (or equivalentlycam = Basler.BaslerPylonCamera()), gives me aBaslerLibError. I put below the complete error message:Would appreciate any insights about what this exception is about.