-
Notifications
You must be signed in to change notification settings - Fork 53
Description
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.