From 72bbf79d3cbdfc51a1c3f052abe807aab106acea Mon Sep 17 00:00:00 2001 From: octopus <912554887@qq.com> Date: Wed, 19 Jan 2022 14:31:42 +0800 Subject: [PATCH] add support for mac --- bcos3sdk/bcos3sdk_wrap.py | 101 ++++++++++++++++++++----------------- client/local_lib_helper.py | 100 +++++++++++++++++++++++++----------- 2 files changed, 125 insertions(+), 76 deletions(-) diff --git a/bcos3sdk/bcos3sdk_wrap.py b/bcos3sdk/bcos3sdk_wrap.py index cec929c..948b3d8 100644 --- a/bcos3sdk/bcos3sdk_wrap.py +++ b/bcos3sdk/bcos3sdk_wrap.py @@ -2,7 +2,7 @@ import ctypes import json import sys from ctypes import * -#https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/c_sdk/api.html +# https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/develop/sdk/c_sdk/api.html # 自定义回调上下文结构体,可以在里面再塞一些有需要的上下文内容 from client.local_lib_helper import LocalLibHelper import queue @@ -63,11 +63,11 @@ class BcosResponse(Structure): return c.contents - -#模拟一个Future对象,用于接收回调,提供一个wait方法,把异步变成同步 +# 模拟一个Future对象,用于接收回调,提供一个wait方法,把异步变成同步 class BcosCallbackFuture: queue = queue.Queue(1) is_timeout: False + def bcos_callback(self, resp): # print(resp) self.size = resp.contents.get_size() @@ -79,17 +79,15 @@ class BcosCallbackFuture: self.context = resp.contents.get_context() self.queue.put_nowait(1) - - def wait(self,timeout=5): + def wait(self, timeout=5): self.is_timeout = False try: - self.queue.get(True,timeout) + self.queue.get(True, timeout) except: self.is_timeout = True pass return self - def display(self): if not hasattr(self, 'data'): print("empty") @@ -111,22 +109,23 @@ class BcosCallbackFuture: # typedef void (*bcos_sdk_c_struct_response_cb)(struct bcos_sdk_c_struct_response* resp) BCOS_CALLBACK_FUNC = CFUNCTYPE(None, POINTER(BcosResponse)) -#typedef void (*bcos_sdk_c_amop_subscribe_cb)( -#const char* endpoint, const char* seq, struct bcos_sdk_c_struct_response* resp); -BCOS_AMOP_SUB_CALLBACK_FUNC = CFUNCTYPE(None,c_char_p,c_char_p,POINTER(BcosResponse)) +# typedef void (*bcos_sdk_c_amop_subscribe_cb)( +# const char* endpoint, const char* seq, struct bcos_sdk_c_struct_response* resp); +BCOS_AMOP_SUB_CALLBACK_FUNC = CFUNCTYPE(None, c_char_p, c_char_p, POINTER(BcosResponse)) # 用dl load的方式封装接口,在windows、linux平台实测通过 class NativeBcos3sdk: - libname_win = 'bcos-c-sdk.dll' - libpath_win = "bcos3sdklib" - libname_linux = "libbcos-c-sdk.so" - libpath_linux = "bcos3sdklib" + # libname_win = 'bcos-c-sdk.dll' + libname = "bcos-c-sdk" + libpath = "bcos3sdklib" + # libname_linux = "libbcos-c-sdk.so" + # libpath_linux = "bcos3sdklib" nativelib = None def __init__(self, cfgfile): self.configfile = cfgfile - locallib = LocalLibHelper(self.libname_win, self.libpath_win, self.libname_linux, self.libpath_linux) + locallib = LocalLibHelper(self.libname, self.libpath) self.nativelib = locallib.load_lib() print("init func") self.init_func() @@ -150,7 +149,8 @@ class NativeBcos3sdk: self.bcos_sdk_get_last_error = self.nativelib.bcos_sdk_get_last_error # bcos_rpc_get_group_info(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_group_info.argtypes = [c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_group_info.argtypes = [ + c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_group_info = self.nativelib.bcos_rpc_get_group_info # void bcos_rpc_get_block_by_number(void* sdk, const char* group, const char* node, int64_t block_number, int only_header, int only_tx_hash, bcos_sdk_c_struct_response_cb callback, void* context) self.nativelib.bcos_rpc_get_block_by_number.argtypes = [c_void_p, c_char_p, c_char_p, c_long, c_uint, c_uint, @@ -170,7 +170,8 @@ class NativeBcos3sdk: self.bcos_rpc_get_block_limit = self.nativelib.bcos_rpc_get_block_limit # void bcos_rpc_get_block_number(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_block_number.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_block_number.argtypes = [ + c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_block_number = self.nativelib.bcos_rpc_get_block_number # void bcos_rpc_get_transaction(void* sdk, const char* group, const char* node, const char* tx_hash,int proof, bcos_sdk_c_struct_response_cb callback, void* context) @@ -187,21 +188,24 @@ class NativeBcos3sdk: c_void_p] self.bcos_rpc_get_code = self.nativelib.bcos_rpc_get_code # void bcos_rpc_get_sealer_list(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context - self.nativelib.bcos_rpc_get_sealer_list.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_sealer_list.argtypes = [ + c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_sealer_list = self.nativelib.bcos_rpc_get_sealer_list # bcos_rpc_get_observer_list self.nativelib.bcos_rpc_get_observer_list.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_observer_list = self.nativelib.bcos_rpc_get_observer_list # void bcos_rpc_get_pbft_view(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_pbft_view.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_pbft_view.argtypes = [ + c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_pbft_view = self.nativelib.bcos_rpc_get_pbft_view # void bcos_rpc_get_pending_tx_size(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) self.nativelib.bcos_rpc_get_pending_tx_size.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_pending_tx_size = self.nativelib.bcos_rpc_get_pending_tx_size # void bcos_rpc_get_sync_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_sync_status.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_sync_status.argtypes = [ + c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_sync_status = self.nativelib.bcos_rpc_get_sync_status # void bcos_rpc_get_consensus_status(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) self.nativelib.bcos_rpc_get_consensus_status.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, @@ -216,7 +220,8 @@ class NativeBcos3sdk: BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_total_transaction_count = self.nativelib.bcos_rpc_get_total_transaction_count # void bcos_rpc_get_group_peers(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_group_peers.argtypes = [c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_group_peers.argtypes = [ + c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_group_peers = self.nativelib.bcos_rpc_get_group_peers # void bcos_rpc_get_peers(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context) self.nativelib.bcos_rpc_get_peers.argtypes = [c_void_p, BCOS_CALLBACK_FUNC, c_void_p] @@ -225,10 +230,12 @@ class NativeBcos3sdk: self.nativelib.bcos_rpc_get_group_list.argtypes = [c_void_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_group_list = self.nativelib.bcos_rpc_get_group_list # void bcos_rpc_get_group_info(void* sdk, const char* group, bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_group_info.argtypes = [c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_group_info.argtypes = [ + c_void_p, c_char_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_group_info = self.nativelib.bcos_rpc_get_group_info # void bcos_rpc_get_group_info_list(void* sdk, bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_rpc_get_group_info_list.argtypes = [c_void_p, BCOS_CALLBACK_FUNC, c_void_p] + self.nativelib.bcos_rpc_get_group_info_list.argtypes = [ + c_void_p, BCOS_CALLBACK_FUNC, c_void_p] self.bcos_rpc_get_group_info_list = self.nativelib.bcos_rpc_get_group_info_list # void bcos_rpc_get_group_node_info(void* sdk, const char* group, const char* node,bcos_sdk_c_struct_response_cb callback, void* context) self.nativelib.bcos_rpc_get_group_node_info.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, @@ -236,59 +243,59 @@ class NativeBcos3sdk: self.bcos_rpc_get_group_node_info = self.nativelib.bcos_rpc_get_group_node_info # event 类sdk - #const char* bcos_event_sub_subscribe_event(void* sdk, const char* group, const char* params,bcos_sdk_c_struct_response_cb callback, void* context) - self.nativelib.bcos_event_sub_subscribe_event.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, - c_void_p] + # const char* bcos_event_sub_subscribe_event(void* sdk, const char* group, const char* params,bcos_sdk_c_struct_response_cb callback, void* context) + self.nativelib.bcos_event_sub_subscribe_event.argtypes = [c_void_p, c_char_p, c_char_p, BCOS_CALLBACK_FUNC, + c_void_p] self.nativelib.bcos_event_sub_subscribe_event.restype = c_char_p self.bcos_event_sub_subscribe_event = self.nativelib.bcos_event_sub_subscribe_event - #void bcos_event_sub_unsubscribe_event(void* sdk, const char* id) - self.nativelib.bcos_event_sub_unsubscribe_event.argtypes = [c_void_p,c_char_p] + # void bcos_event_sub_unsubscribe_event(void* sdk, const char* id) + self.nativelib.bcos_event_sub_unsubscribe_event.argtypes = [c_void_p, c_char_p] self.bcos_event_sub_unsubscribe_event = self.nativelib.bcos_event_sub_unsubscribe_event - #AMOP类sdk - #void bcos_amop_subscribe_topic(void* sdk, char** topics, size_t count) - #有个指针数组参数,有待测试 - self.nativelib.bcos_amop_subscribe_topic.argtypes = [c_void_p, POINTER(c_char_p),c_int] + # AMOP类sdk + # void bcos_amop_subscribe_topic(void* sdk, char** topics, size_t count) + # 有个指针数组参数,有待测试 + self.nativelib.bcos_amop_subscribe_topic.argtypes = [c_void_p, POINTER(c_char_p), c_int] self.bcos_amop_subscribe_topic = self.nativelib.bcos_amop_subscribe_topic # void bcos_amop_subscribe_topic_with_cb(void* sdk, const char* topic, bcos_sdk_c_amop_subscribe_cb cb, void* context) self.nativelib.bcos_amop_subscribe_topic_with_cb.argtypes = [c_void_p, c_char_p, BCOS_AMOP_SUB_CALLBACK_FUNC, - c_void_p] + c_void_p] self.bcos_amop_subscribe_topic_with_cb = self.nativelib.bcos_amop_subscribe_topic_with_cb - #void bcos_amop_set_subscribe_topic_cb(void* sdk, bcos_sdk_c_amop_subscribe_cb cb, void* context) + # void bcos_amop_set_subscribe_topic_cb(void* sdk, bcos_sdk_c_amop_subscribe_cb cb, void* context) self.nativelib.bcos_amop_set_subscribe_topic_cb.argtypes = [c_void_p, BCOS_AMOP_SUB_CALLBACK_FUNC, - c_void_p] + c_void_p] self.bcos_amop_set_subscribe_topic_cb = self.nativelib.bcos_amop_set_subscribe_topic_cb - #void bcos_amop_unsubscribe_topic(void* sdk, char** topics, size_t count) + # void bcos_amop_unsubscribe_topic(void* sdk, char** topics, size_t count) self.nativelib.bcos_amop_unsubscribe_topic.argtypes = [c_void_p, POINTER(c_char_p), c_long] self.bcos_amop_unsubscribe_topic = self.nativelib.bcos_amop_unsubscribe_topic - #void bcos_amop_publish(void* sdk, const char* topic, void* data, size_t size, uint32_t timeout,bcos_sdk_c_amop_publish_cb cb, void* context) - self.nativelib.bcos_amop_publish.argtypes = [c_void_p, c_char_p,c_long,c_int,BCOS_AMOP_SUB_CALLBACK_FUNC, c_void_p] + # void bcos_amop_publish(void* sdk, const char* topic, void* data, size_t size, uint32_t timeout,bcos_sdk_c_amop_publish_cb cb, void* context) + self.nativelib.bcos_amop_publish.argtypes = [ + c_void_p, c_char_p, c_long, c_int, BCOS_AMOP_SUB_CALLBACK_FUNC, c_void_p] self.bcos_amop_publish = self.nativelib.bcos_amop_publish - #void bcos_amop_broadcast(void* sdk, const char* topic, void* data, size_t size) - self.nativelib.bcos_amop_broadcast.argtypes = [c_void_p, c_char_p,c_char_p,c_long] + # void bcos_amop_broadcast(void* sdk, const char* topic, void* data, size_t size) + self.nativelib.bcos_amop_broadcast.argtypes = [c_void_p, c_char_p, c_char_p, c_long] self.bcos_amop_broadcast = self.nativelib.bcos_amop_broadcast - #void bcos_amop_send_response(void* sdk, const char* peer, const char* seq, void* data, size_t size) - self.nativelib.bcos_amop_send_response.argtypes = [c_void_p, c_char_p,c_char_p,c_char_p,c_long] + # void bcos_amop_send_response(void* sdk, const char* peer, const char* seq, void* data, size_t size) + self.nativelib.bcos_amop_send_response.argtypes = [ + c_void_p, c_char_p, c_char_p, c_char_p, c_long] self.bcos_amop_send_response = self.nativelib.bcos_amop_send_response - - # 启动sdk + def start_sdk(self): configfile = self.configfile if type(configfile) is str: configfile = configfile.encode("utf-8") - print("create sdk by configfile:",configfile) + print("create sdk by configfile:", configfile) self.sdk = self.bcos_sdk_create_by_config_file(configfile) # print("sdk is ",self.sdk) if self.sdk is None: - #print(self.bcos_sdk_get_last_error_msg()) + # print(self.bcos_sdk_get_last_error_msg()) sys.exit(-1) self.bcos_sdk_start(self.sdk) - diff --git a/client/local_lib_helper.py b/client/local_lib_helper.py index 881fda6..567dc48 100644 --- a/client/local_lib_helper.py +++ b/client/local_lib_helper.py @@ -1,37 +1,77 @@ import ctypes +from email.mime import base import os import platform from ctypes import PyDLL class LocalLibHelper: - libname_win = "" - libpath_win = "" - libname_linux = "" - libpath_linux = "" - target_libname = "" - target_libpath = "" - target_platform = "unknown" + # libname_win = "" + # libpath_win = "" + # libname_linux = "" + # libpath_linux = "" + # target_libname = "" + # target_libpath = "" nativelib = None - def __init__(self,name_win,path_win,name_linux,path_linux): - self.libname_win = name_win - self.libpath_win = path_win - self.libname_linux = name_linux - self.libpath_linux = path_linux - # 先处理平台兼容性 - target_platform = "unknown" - platsys = platform.platform() - if platsys.lower().startswith("win"): - self.target_platform = "win64" - self.target_libname = self.libname_win - self.target_libpath = self.libpath_win - if "linux" in platsys.lower(): - self.target_platform = "linux" - self.target_libname = self.libname_linux - self.target_libpath = self.libpath_linux - - print("target_libpath", self.target_libpath) + target_platform = "unknown" + lib_base_name = "" + lib_dir_path = "" + lib_name = None + + def __init__(self, base_name, dir_path) -> None: + platsys = platform.platform().lower() + print("platform {}:, lib: {}, dir: {}".format(platsys, base_name, dir_path)) + + self.target_platform = platsys + self.lib_base_name = base_name + self.lib_dir_path = dir_path + + lib_prefix = '' + lib_suffix = '' + + if platsys.startswith("win"): # Windows + lib_prefix = '' + lib_suffix = '.dll' + elif "mac" in platsys: # Mac + if "arm64" in platsys: # mac m1 + lib_prefix = 'lib' + lib_suffix = '-arch64.dylib' + else: # mac x86 + lib_prefix = 'lib' + lib_suffix = '.dylib' + elif "linux" in platsys: # Linux + if "arm64" in platsys or "aarch64" in platsys: # linux arm, unsupported + raise Exception('''Unsupported linux arch {}'''.format(platsys)) + elif "x86_64" in platsys: # linux x86 + lib_prefix = 'lib' + lib_suffix = '.so' + else: # unknown arch + raise Exception('''Unsupported linux arch {}'''.format(platsys)) + else: # unknown os + raise Exception('''Unsupported os {}'''.format(platsys)) + + self.lib_name = lib_prefix + self.lib_base_name + lib_suffix + print(" => libname", self.lib_name) + + # def __init__(self, name_win, path_win, name_linux, path_linux): + # self.libname_win = name_win + # self.libpath_win = path_win + # self.libname_linux = name_linux + # self.libpath_linux = path_linux + # # 先处理平台兼容性 + # target_platform = "unknown" + # platsys = platform.platform() + # if platsys.lower().startswith("win"): + # self.target_platform = "win64" + # self.target_libname = self.libname_win + # self.target_libpath = self.libpath_win + # if "linux" in platsys.lower(): + # self.target_platform = "linux" + # self.target_libname = self.libname_linux + # self.target_libpath = self.libpath_linux + + # print("target_libpath", self.target_libpath) def load_lib(self): # os.add_dll_directory(module_path) @@ -40,18 +80,20 @@ class LocalLibHelper: return self.nativelib currpath = os.getcwd() - # print( "load_lib currpath ",currpath) - read_lib_name = os.path.join(currpath, self.target_libname) + # print("load_lib currpath ", currpath) + # print("lib name ", self.lib_name) + read_lib_name = os.path.join(currpath, self.lib_name) if not os.path.exists(read_lib_name): # 当前目录位置未找到,试图加上相对路径再来一次 - read_lib_name = os.path.join(currpath, self.target_libpath, self.target_libname) + read_lib_name = os.path.join(currpath, self.lib_dir_path, self.lib_name) #print("load_lib name:",read_lib_name) if self.target_platform.lower().startswith("win"): os.add_dll_directory(os.path.dirname(read_lib_name)) #print("start to load lib") self.nativelib = PyDLL(read_lib_name, ctypes.RTLD_GLOBAL) #print("load lib obj : ",self.nativelib) - #print(self.nativelib) + # print(self.nativelib) if self.nativelib is None: + print("load_lib ", self.lib_name) return None return self.nativelib -- Gitee