0.1.123
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| [metadata] | [metadata] | ||||||
| # replace with your username: | # replace with your username: | ||||||
| name = guan | name = guan | ||||||
| version = 0.1.122 | version = 0.1.123 | ||||||
| author = guanjihuan | author = guanjihuan | ||||||
| author_email = guanjihuan@163.com | author_email = guanjihuan@163.com | ||||||
| description = An open source python package | description = An open source python package | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| Metadata-Version: 2.1 | Metadata-Version: 2.1 | ||||||
| Name: guan | Name: guan | ||||||
| Version: 0.1.122 | Version: 0.1.123 | ||||||
| Summary: An open source python package | Summary: An open source python package | ||||||
| Home-page: https://py.guanjihuan.com | Home-page: https://py.guanjihuan.com | ||||||
| Author: guanjihuan | Author: guanjihuan | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ def chat(prompt='你好', model=1, stream=0, top_p=0.8, temperature=0.85): | |||||||
|             'temperature': temperature, |             'temperature': temperature, | ||||||
|         } |         } | ||||||
|         send_message = json.dumps(message) |         send_message = json.dumps(message) | ||||||
|         client_socket.send(send_message.encode()) |         client_socket.send(send_message.encode('utf-8')) | ||||||
|         if stream == 1: |         if stream == 1: | ||||||
|             print('\n--- Begin Stream Message ---\n') |             print('\n--- Begin Stream Message ---\n') | ||||||
|         response = '' |         response = '' | ||||||
| @@ -207,7 +207,7 @@ def convert_matrix_data_into_xyz_data(x_array, y_array, matrix): | |||||||
|             z_array[ix*len_y+iy] = matrix[ix, iy] |             z_array[ix*len_y+iy] = matrix[ix, iy] | ||||||
|     return x_array, y_array, z_array |     return x_array, y_array, z_array | ||||||
|  |  | ||||||
| # 通过定义计算R^2(基于实际值和预测值) | # 通过定义计算R^2(基于实际值和预测值,数值有可能小于0) | ||||||
| def calculate_R2_with_definition(y_true_array, y_pred_array): | def calculate_R2_with_definition(y_true_array, y_pred_array): | ||||||
|     import numpy as np |     import numpy as np | ||||||
|     y_mean = np.mean(y_true_array) |     y_mean = np.mean(y_true_array) | ||||||
| @@ -216,25 +216,19 @@ def calculate_R2_with_definition(y_true_array, y_pred_array): | |||||||
|     R2 = 1 - (SS_res / SS_tot) |     R2 = 1 - (SS_res / SS_tot) | ||||||
|     return R2 |     return R2 | ||||||
|  |  | ||||||
| # 通过sklearn计算R^2,和定义的计算结果一致 | # 通过sklearn计算R^2,和上面定义的计算结果一致 | ||||||
| def calculate_R2_with_sklearn(y_true_array, y_pred_array): | def calculate_R2_with_sklearn(y_true_array, y_pred_array): | ||||||
|     from sklearn.metrics import r2_score |     from sklearn.metrics import r2_score | ||||||
|     R2 = r2_score(y_true_array, y_pred_array) |     R2 = r2_score(y_true_array, y_pred_array) | ||||||
|     return R2 |     return R2 | ||||||
|  |  | ||||||
| # 通过scipy计算线性回归后的R^2(基于线性回归模型) | # 通过scipy计算线性回归后的R^2(基于线性回归模型,范围在0和1之间) | ||||||
| def calculate_R2_after_linear_regression_with_scipy(y_true_array, y_pred_array): | def calculate_R2_after_linear_regression_with_scipy(y_true_array, y_pred_array): | ||||||
|     from scipy import stats |     from scipy import stats | ||||||
|     slope, intercept, r_value, p_value, std_err = stats.linregress(y_true_array, y_pred_array) |     slope, intercept, r_value, p_value, std_err = stats.linregress(y_true_array, y_pred_array) | ||||||
|     R2 = r_value**2 |     R2 = r_value**2 | ||||||
|     return R2 |     return R2 | ||||||
|  |  | ||||||
| # 获取函数或类的源码(返回字符串) |  | ||||||
| def get_source(name): |  | ||||||
|     import inspect |  | ||||||
|     source = inspect.getsource(name) |  | ||||||
|     return source |  | ||||||
|  |  | ||||||
| # 判断一个数是否接近于整数 | # 判断一个数是否接近于整数 | ||||||
| def close_to_integer(value, abs_tol=1e-3): | def close_to_integer(value, abs_tol=1e-3): | ||||||
|     import math |     import math | ||||||
| @@ -338,6 +332,12 @@ def count_words(text, include_space=0, show_words=0): | |||||||
|         print(new_words_2) |         print(new_words_2) | ||||||
|     return num_words |     return num_words | ||||||
|  |  | ||||||
|  | # 获取函数或类的源码(返回字符串) | ||||||
|  | def get_source(name): | ||||||
|  |     import inspect | ||||||
|  |     source = inspect.getsource(name) | ||||||
|  |     return source | ||||||
|  |  | ||||||
| # 将RGB转成HEX | # 将RGB转成HEX | ||||||
| def rgb_to_hex(rgb, pound=1): | def rgb_to_hex(rgb, pound=1): | ||||||
|     if pound==0: |     if pound==0: | ||||||
| @@ -355,12 +355,357 @@ def hex_to_rgb(hex): | |||||||
| def encryption_MD5(password, salt=''): | def encryption_MD5(password, salt=''): | ||||||
|     import hashlib |     import hashlib | ||||||
|     password = salt+password |     password = salt+password | ||||||
|     hashed_password = hashlib.md5(password.encode()).hexdigest() |     hashed_password = hashlib.md5(password.encode('utf-8')).hexdigest() | ||||||
|     return hashed_password |     return hashed_password | ||||||
|  |  | ||||||
| # 使用SHA-256进行散列加密 | # 使用SHA-256进行散列加密(常用且相对比较安全) | ||||||
| def encryption_SHA_256(password, salt=''): | def encryption_SHA_256(password, salt=''): | ||||||
|     import hashlib |     import hashlib | ||||||
|     password = salt+password |     password = salt+password | ||||||
|     hashed_password = hashlib.sha256(password.encode()).hexdigest() |     hashed_password = hashlib.sha256(password.encode('utf-8')).hexdigest() | ||||||
|     return hashed_password |     return hashed_password | ||||||
|  |  | ||||||
|  | # 使用bcrypt生成盐并加密(常用且更加安全) | ||||||
|  | def encryption_bcrypt(password): | ||||||
|  |     import bcrypt | ||||||
|  |     salt = bcrypt.gensalt() | ||||||
|  |     hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt) | ||||||
|  |     return hashed_password | ||||||
|  |  | ||||||
|  | # 验证bcrypt加密的密码(这里的hashed_password已经包含了生成时使用的盐,bcrypt.checkpw会自动从hashed_password中提取盐,因此在验证时无需再单独传递盐) | ||||||
|  | def check_bcrypt_hashed_password(password_input, hashed_password): | ||||||
|  |     import bcrypt | ||||||
|  |     return bcrypt.checkpw(password_input.encode('utf-8'), hashed_password) | ||||||
|  |  | ||||||
|  | # 获取当前日期字符串 | ||||||
|  | def get_date(bar=True): | ||||||
|  |     import datetime | ||||||
|  |     datetime_date = str(datetime.date.today()) | ||||||
|  |     if bar==False: | ||||||
|  |         datetime_date = datetime_date.replace('-', '') | ||||||
|  |     return datetime_date | ||||||
|  |  | ||||||
|  | # 获取当前时间字符串 | ||||||
|  | def get_time(colon=True): | ||||||
|  |     import datetime | ||||||
|  |     datetime_time = datetime.datetime.now().strftime('%H:%M:%S') | ||||||
|  |     if colon==False: | ||||||
|  |         datetime_time = datetime_time.replace(':', '') | ||||||
|  |     return datetime_time | ||||||
|  |  | ||||||
|  | # 获取运行的日期和时间并写入文件 | ||||||
|  | def statistics_with_day_and_time(content='', filename='a', file_format='.txt'): | ||||||
|  |     import datetime | ||||||
|  |     datetime_today = str(datetime.date.today()) | ||||||
|  |     datetime_time = datetime.datetime.now().strftime('%H:%M:%S') | ||||||
|  |     with open(filename+file_format, 'a', encoding="utf-8") as f2: | ||||||
|  |        if content == '': | ||||||
|  |            f2.write(datetime_today+' '+datetime_time+'\n') | ||||||
|  |        else: | ||||||
|  |            f2.write(datetime_today+' '+datetime_time+' '+content+'\n') | ||||||
|  |  | ||||||
|  | # 获取本月的所有日期 | ||||||
|  | def get_date_array_of_the_current_month(str_or_datetime='str'): | ||||||
|  |     import datetime | ||||||
|  |     today = datetime.date.today() | ||||||
|  |     first_day_of_month = today.replace(day=1) | ||||||
|  |     if first_day_of_month.month == 12: | ||||||
|  |         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) | ||||||
|  |     else: | ||||||
|  |         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) | ||||||
|  |     current_date = first_day_of_month | ||||||
|  |     date_array = [] | ||||||
|  |     while current_date < next_month: | ||||||
|  |         if str_or_datetime=='str': | ||||||
|  |             date_array.append(str(current_date)) | ||||||
|  |         elif str_or_datetime=='datetime': | ||||||
|  |             date_array.append(current_date) | ||||||
|  |         current_date += datetime.timedelta(days=1) | ||||||
|  |     return date_array | ||||||
|  |  | ||||||
|  | # 获取上个月份 | ||||||
|  | def get_last_month(): | ||||||
|  |     import datetime | ||||||
|  |     today = datetime.date.today() | ||||||
|  |     last_month = today.month - 1 | ||||||
|  |     if last_month == 0: | ||||||
|  |         last_month = 12 | ||||||
|  |         year_of_last_month = today.year - 1 | ||||||
|  |     else: | ||||||
|  |         year_of_last_month = today.year | ||||||
|  |     return year_of_last_month, last_month | ||||||
|  |  | ||||||
|  | # 获取上上个月份 | ||||||
|  | def get_the_month_before_last(): | ||||||
|  |     import datetime | ||||||
|  |     today = datetime.date.today() | ||||||
|  |     the_month_before_last = today.month - 2 | ||||||
|  |     if the_month_before_last == 0: | ||||||
|  |         the_month_before_last = 12  | ||||||
|  |         year_of_the_month_before_last = today.year - 1 | ||||||
|  |     else: | ||||||
|  |         year_of_the_month_before_last = today.year | ||||||
|  |     if the_month_before_last == -1: | ||||||
|  |         the_month_before_last = 11 | ||||||
|  |         year_of_the_month_before_last = today.year - 1 | ||||||
|  |     else: | ||||||
|  |         year_of_the_month_before_last = today.year | ||||||
|  |     return year_of_the_month_before_last, the_month_before_last | ||||||
|  |  | ||||||
|  | # 获取上个月的所有日期 | ||||||
|  | def get_date_array_of_the_last_month(str_or_datetime='str'): | ||||||
|  |     import datetime | ||||||
|  |     import guan | ||||||
|  |     today = datetime.date.today() | ||||||
|  |     year_of_last_month, last_month = guan.get_last_month() | ||||||
|  |     first_day_of_month = today.replace(year=year_of_last_month, month=last_month, day=1) | ||||||
|  |     if first_day_of_month.month == 12: | ||||||
|  |         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) | ||||||
|  |     else: | ||||||
|  |         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) | ||||||
|  |     current_date = first_day_of_month | ||||||
|  |     date_array = [] | ||||||
|  |     while current_date < next_month: | ||||||
|  |         if str_or_datetime=='str': | ||||||
|  |             date_array.append(str(current_date)) | ||||||
|  |         elif str_or_datetime=='datetime': | ||||||
|  |             date_array.append(current_date) | ||||||
|  |         current_date += datetime.timedelta(days=1) | ||||||
|  |     return date_array | ||||||
|  |  | ||||||
|  | # 获取上上个月的所有日期 | ||||||
|  | def get_date_array_of_the_month_before_last(str_or_datetime='str'): | ||||||
|  |     import datetime | ||||||
|  |     import guan | ||||||
|  |     today = datetime.date.today() | ||||||
|  |     year_of_last_last_month, last_last_month = guan.get_the_month_before_last() | ||||||
|  |     first_day_of_month = today.replace(year=year_of_last_last_month, month=last_last_month, day=1) | ||||||
|  |     if first_day_of_month.month == 12: | ||||||
|  |         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) | ||||||
|  |     else: | ||||||
|  |         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) | ||||||
|  |     current_date = first_day_of_month | ||||||
|  |     date_array = [] | ||||||
|  |     while current_date < next_month: | ||||||
|  |         if str_or_datetime=='str': | ||||||
|  |             date_array.append(str(current_date)) | ||||||
|  |         elif str_or_datetime=='datetime': | ||||||
|  |             date_array.append(current_date) | ||||||
|  |         current_date += datetime.timedelta(days=1) | ||||||
|  |     return date_array | ||||||
|  |  | ||||||
|  | # 根据新的日期,填充数组中缺少的数据为零 | ||||||
|  | def fill_zero_data_for_new_dates(old_dates, new_dates, old_data_array): | ||||||
|  |     new_data_array = [] | ||||||
|  |     for date in new_dates: | ||||||
|  |         if str(date) not in old_dates: | ||||||
|  |             new_data_array.append(0) | ||||||
|  |         else: | ||||||
|  |             index = old_dates.index(date) | ||||||
|  |             new_data_array.append(old_data_array[index]) | ||||||
|  |     return new_data_array | ||||||
|  |  | ||||||
|  | # 获取CPU使用率 | ||||||
|  | def get_cpu_usage(interval=1): | ||||||
|  |     import psutil | ||||||
|  |     cpu_usage = psutil.cpu_percent(interval=interval) | ||||||
|  |     return cpu_usage | ||||||
|  |  | ||||||
|  | # 获取内存信息 | ||||||
|  | def get_memory_info(): | ||||||
|  |     import psutil | ||||||
|  |     memory_info = psutil.virtual_memory() | ||||||
|  |     total_memory = memory_info.total/(1024**2) | ||||||
|  |     used_memory = memory_info.used/(1024**2) | ||||||
|  |     available_memory = memory_info.available/(1024**2) | ||||||
|  |     used_memory_percent = memory_info.percent | ||||||
|  |     return total_memory, used_memory, available_memory, used_memory_percent | ||||||
|  |  | ||||||
|  | # 获取MAC地址 | ||||||
|  | def get_mac_address(): | ||||||
|  |     import uuid | ||||||
|  |     mac_address = uuid.UUID(int=uuid.getnode()).hex[-12:].upper() | ||||||
|  |     mac_address = '-'.join([mac_address[i:i+2] for i in range(0, 11, 2)]) | ||||||
|  |     return mac_address | ||||||
|  |  | ||||||
|  | # 获取软件包中的所有模块名 | ||||||
|  | def get_all_modules_in_one_package(package_name='guan'): | ||||||
|  |     import pkgutil | ||||||
|  |     package = __import__(package_name) | ||||||
|  |     module_names = [name for _, name, _ in pkgutil.iter_modules(package.__path__)] | ||||||
|  |     return module_names | ||||||
|  |  | ||||||
|  | # 获取软件包中一个模块的所有函数名 | ||||||
|  | def get_all_functions_in_one_module(module_name, package_name='guan'): | ||||||
|  |     import inspect | ||||||
|  |     function_names = [] | ||||||
|  |     module = __import__(f"{package_name}.{module_name}", fromlist=[""]) | ||||||
|  |     for name, obj in inspect.getmembers(module): | ||||||
|  |         if inspect.isfunction(obj): | ||||||
|  |             function_names.append(name) | ||||||
|  |     return function_names | ||||||
|  |  | ||||||
|  | # 获取软件包中的所有函数名 | ||||||
|  | def get_all_functions_in_one_package(package_name='guan', print_show=1): | ||||||
|  |     import guan | ||||||
|  |     module_names = guan.get_all_modules_in_one_package(package_name=package_name) | ||||||
|  |     all_function_names = [] | ||||||
|  |     for module_name in module_names: | ||||||
|  |         function_names = guan.get_all_functions_in_one_module(module_name, package_name='guan') | ||||||
|  |         if print_show == 1: | ||||||
|  |             print('Module:', module_name) | ||||||
|  |         for name in function_names: | ||||||
|  |             all_function_names.append(name) | ||||||
|  |             if print_show == 1: | ||||||
|  |                 print('function:', name) | ||||||
|  |         if print_show == 1: | ||||||
|  |             print() | ||||||
|  |     return all_function_names | ||||||
|  |  | ||||||
|  | # 获取调用本函数的函数名 | ||||||
|  | def get_calling_function_name(layer=1): | ||||||
|  |     import inspect | ||||||
|  |     caller = inspect.stack()[layer] | ||||||
|  |     calling_function_name = caller.function | ||||||
|  |     return calling_function_name | ||||||
|  |  | ||||||
|  | # 统计Python文件中import的数量并排序 | ||||||
|  | def count_number_of_import_statements(filename, file_format='.py', num=1000): | ||||||
|  |     with open(filename+file_format, 'r') as file: | ||||||
|  |         lines = file.readlines() | ||||||
|  |     import_array = [] | ||||||
|  |     for line in lines: | ||||||
|  |         if 'import ' in line: | ||||||
|  |             line = line.strip() | ||||||
|  |             import_array.append(line) | ||||||
|  |     from collections import Counter | ||||||
|  |     import_statement_counter = Counter(import_array).most_common(num) | ||||||
|  |     return import_statement_counter | ||||||
|  |  | ||||||
|  | # 查找文件名相同的文件 | ||||||
|  | def find_repeated_file_with_same_filename(directory='./', ignored_directory_with_words=[], ignored_file_with_words=[], num=1000): | ||||||
|  |     import os | ||||||
|  |     from collections import Counter | ||||||
|  |     file_list = [] | ||||||
|  |     for root, dirs, files in os.walk(directory): | ||||||
|  |         for i0 in range(len(files)): | ||||||
|  |             file_list.append(files[i0]) | ||||||
|  |             for word in ignored_directory_with_words: | ||||||
|  |                 if word in root: | ||||||
|  |                     file_list.remove(files[i0])        | ||||||
|  |             for word in ignored_file_with_words: | ||||||
|  |                 if word in files[i0]: | ||||||
|  |                     try: | ||||||
|  |                         file_list.remove(files[i0])    | ||||||
|  |                     except: | ||||||
|  |                         pass  | ||||||
|  |     count_file = Counter(file_list).most_common(num) | ||||||
|  |     repeated_file = [] | ||||||
|  |     for item in count_file: | ||||||
|  |         if item[1]>1: | ||||||
|  |             repeated_file.append(item) | ||||||
|  |     return repeated_file | ||||||
|  |  | ||||||
|  | # 统计各个子文件夹中的文件数量 | ||||||
|  | def count_file_in_sub_directory(directory='./', sort=0, reverse=1, print_show=1, smaller_than_num=None): | ||||||
|  |     import os | ||||||
|  |     import numpy as np | ||||||
|  |     dirs_list = [] | ||||||
|  |     for root, dirs, files in os.walk(directory): | ||||||
|  |         if dirs != []: | ||||||
|  |             for i0 in range(len(dirs)): | ||||||
|  |                 dirs_list.append(root+'/'+dirs[i0]) | ||||||
|  |     count_file_array = [] | ||||||
|  |     for sub_dir in dirs_list: | ||||||
|  |         file_list = [] | ||||||
|  |         for root, dirs, files in os.walk(sub_dir): | ||||||
|  |             for i0 in range(len(files)): | ||||||
|  |                 file_list.append(files[i0]) | ||||||
|  |         count_file = len(file_list) | ||||||
|  |         count_file_array.append(count_file) | ||||||
|  |         if sort == 0: | ||||||
|  |             if print_show == 1: | ||||||
|  |                 if smaller_than_num == None: | ||||||
|  |                     print(sub_dir) | ||||||
|  |                     print(count_file) | ||||||
|  |                     print() | ||||||
|  |                 else: | ||||||
|  |                     if count_file<smaller_than_num: | ||||||
|  |                         print(sub_dir) | ||||||
|  |                         print(count_file) | ||||||
|  |                         print() | ||||||
|  |     if sort == 0: | ||||||
|  |         sub_directory = dirs_list | ||||||
|  |         num_in_sub_directory = count_file_array | ||||||
|  |     if sort == 1: | ||||||
|  |         sub_directory = [] | ||||||
|  |         num_in_sub_directory = [] | ||||||
|  |         if reverse == 1: | ||||||
|  |             index_array = np.argsort(count_file_array)[::-1] | ||||||
|  |         else: | ||||||
|  |             index_array = np.argsort(count_file_array) | ||||||
|  |         for i0 in index_array: | ||||||
|  |             sub_directory.append(dirs_list[i0]) | ||||||
|  |             num_in_sub_directory.append(count_file_array[i0]) | ||||||
|  |             if print_show == 1: | ||||||
|  |                 if smaller_than_num == None: | ||||||
|  |                     print(dirs_list[i0]) | ||||||
|  |                     print(count_file_array[i0]) | ||||||
|  |                     print() | ||||||
|  |                 else: | ||||||
|  |                     if count_file_array[i0]<smaller_than_num: | ||||||
|  |                         print(dirs_list[i0]) | ||||||
|  |                         print(count_file_array[i0]) | ||||||
|  |                         print() | ||||||
|  |     return sub_directory, num_in_sub_directory | ||||||
|  |  | ||||||
|  | # 在多个子文件夹中产生必要的文件,例如 readme.md | ||||||
|  | def creat_necessary_file(directory, filename='readme', file_format='.md', content='', overwrite=None, ignored_directory_with_words=[]): | ||||||
|  |     import os | ||||||
|  |     directory_with_file = [] | ||||||
|  |     ignored_directory = [] | ||||||
|  |     for root, dirs, files in os.walk(directory): | ||||||
|  |         for i0 in range(len(files)): | ||||||
|  |             if root not in directory_with_file: | ||||||
|  |                 directory_with_file.append(root) | ||||||
|  |             if files[i0] == filename+file_format: | ||||||
|  |                 if root not in ignored_directory: | ||||||
|  |                     ignored_directory.append(root) | ||||||
|  |     if overwrite == None: | ||||||
|  |         for root in ignored_directory: | ||||||
|  |             directory_with_file.remove(root) | ||||||
|  |     ignored_directory_more =[] | ||||||
|  |     for root in directory_with_file:  | ||||||
|  |         for word in ignored_directory_with_words: | ||||||
|  |             if word in root: | ||||||
|  |                 if root not in ignored_directory_more: | ||||||
|  |                     ignored_directory_more.append(root) | ||||||
|  |     for root in ignored_directory_more: | ||||||
|  |         directory_with_file.remove(root)  | ||||||
|  |     for root in directory_with_file: | ||||||
|  |         os.chdir(root) | ||||||
|  |         f = open(filename+file_format, 'w', encoding="utf-8") | ||||||
|  |         f.write(content) | ||||||
|  |         f.close() | ||||||
|  |  | ||||||
|  | # 删除特定文件名的文件(谨慎使用) | ||||||
|  | def delete_file_with_specific_name(directory, filename='readme', file_format='.md'): | ||||||
|  |     import os | ||||||
|  |     for root, dirs, files in os.walk(directory): | ||||||
|  |         for i0 in range(len(files)): | ||||||
|  |             if files[i0] == filename+file_format: | ||||||
|  |                 os.remove(root+'/'+files[i0]) | ||||||
|  |  | ||||||
|  | # 将所有文件移到根目录(谨慎使用) | ||||||
|  | def move_all_files_to_root_directory(directory): | ||||||
|  |     import os | ||||||
|  |     import shutil | ||||||
|  |     for root, dirs, files in os.walk(directory): | ||||||
|  |         for i0 in range(len(files)): | ||||||
|  |             shutil.move(root+'/'+files[i0], directory+'/'+files[i0]) | ||||||
|  |     for i0 in range(100): | ||||||
|  |         for root, dirs, files in os.walk(directory): | ||||||
|  |             try: | ||||||
|  |                 os.rmdir(root)  | ||||||
|  |             except: | ||||||
|  |                 pass | ||||||
| @@ -1,36 +1,44 @@ | |||||||
| # Module: others | # Module: others | ||||||
|  |  | ||||||
| # 获取当前日期字符串 | # 获取软件包的本机版本 | ||||||
| def get_date(bar=True): | def get_current_version(package_name='guan'): | ||||||
|     import datetime |     import importlib.metadata | ||||||
|     datetime_date = str(datetime.date.today()) |     try: | ||||||
|     if bar==False: |         current_version = importlib.metadata.version(package_name) | ||||||
|         datetime_date = datetime_date.replace('-', '') |         return current_version | ||||||
|     return datetime_date |     except: | ||||||
|  |         return None | ||||||
|  |  | ||||||
| # 获取当前时间字符串 | # 获取Python软件包的最新版本 | ||||||
| def get_time(colon=True): | def get_latest_version(package_name='guan', timeout=5): | ||||||
|     import datetime |     import requests | ||||||
|     datetime_time = datetime.datetime.now().strftime('%H:%M:%S') |     url = f"https://pypi.org/pypi/{package_name}/json" | ||||||
|     if colon==False: |     try: | ||||||
|         datetime_time = datetime_time.replace(':', '') |         response = requests.get(url, timeout=timeout) | ||||||
|     return datetime_time |     except: | ||||||
|  |         return None | ||||||
|  |     if response.status_code == 200: | ||||||
|  |         data = response.json() | ||||||
|  |         latest_version = data["info"]["version"] | ||||||
|  |         return latest_version | ||||||
|  |     else: | ||||||
|  |         return None | ||||||
|  |  | ||||||
| # 获取CPU使用率 | # 获取包含某个字符的进程PID值 | ||||||
| def get_cpu_usage(interval=1): | def get_PID_array(name): | ||||||
|     import psutil |     import subprocess | ||||||
|     cpu_usage = psutil.cpu_percent(interval=interval) |     command = "ps -ef | grep "+name | ||||||
|     return cpu_usage |     result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) | ||||||
|  |     if result.returncode == 0: | ||||||
| # 获取内存信息 |         ps_ef = result.stdout | ||||||
| def get_memory_info(): |     import re | ||||||
|     import psutil |     ps_ef_1 = re.split(r'\n', ps_ef) | ||||||
|     memory_info = psutil.virtual_memory() |     id_running_array = [] | ||||||
|     total_memory = memory_info.total/(1024**2) |     for ps_ef_item in ps_ef_1: | ||||||
|     used_memory = memory_info.used/(1024**2) |         if ps_ef_item != '': | ||||||
|     available_memory = memory_info.available/(1024**2) |             ps_ef_2 = re.split(r'\s+', ps_ef_item) | ||||||
|     used_memory_percent = memory_info.percent |             id_running_array.append(ps_ef_2[1]) | ||||||
|     return total_memory, used_memory, available_memory, used_memory_percent |     return id_running_array | ||||||
|  |  | ||||||
| # 每日git commit次数的统计 | # 每日git commit次数的统计 | ||||||
| def statistics_of_git_commits(print_show=0, str_or_datetime='str'): | def statistics_of_git_commits(print_show=0, str_or_datetime='str'): | ||||||
| @@ -57,522 +65,6 @@ def statistics_of_git_commits(print_show=0, str_or_datetime='str'): | |||||||
|         commit_count_array.append(count) |         commit_count_array.append(count) | ||||||
|     return date_array, commit_count_array |     return date_array, commit_count_array | ||||||
|  |  | ||||||
| # 将WordPress导出的XML格式文件转换成多个MarkDown格式的文件 |  | ||||||
| def convert_wordpress_xml_to_markdown(xml_file='./a.xml', convert_content=1, replace_more=[]): |  | ||||||
|     import xml.etree.ElementTree as ET |  | ||||||
|     import re |  | ||||||
|     tree = ET.parse(xml_file) |  | ||||||
|     root = tree.getroot() |  | ||||||
|     for item in root.findall('.//item'): |  | ||||||
|         title = item.find('title').text |  | ||||||
|         content = item.find('.//content:encoded', namespaces={'content': 'http://purl.org/rss/1.0/modules/content/'}).text |  | ||||||
|         if convert_content == 1: |  | ||||||
|             content = re.sub(r'<!--.*?-->', '', content) |  | ||||||
|             content = content.replace('<p>', '') |  | ||||||
|             content = content.replace('</p>', '') |  | ||||||
|             content = content.replace('<ol>', '') |  | ||||||
|             content = content.replace('</ol>', '') |  | ||||||
|             content = content.replace('<ul>', '') |  | ||||||
|             content = content.replace('</ul>', '') |  | ||||||
|             content = content.replace('<strong>', '') |  | ||||||
|             content = content.replace('</strong>', '') |  | ||||||
|             content = content.replace('</li>', '') |  | ||||||
|             content = content.replace('<li>', '+ ') |  | ||||||
|             content = content.replace('</h3>', '') |  | ||||||
|             content = re.sub(r'<h2.*?>', '## ', content) |  | ||||||
|             content = re.sub(r'<h3.*?>', '### ', content) |  | ||||||
|             content = re.sub(r'<h4.*?>', '#### ', content) |  | ||||||
|             for replace_item in replace_more: |  | ||||||
|                 content = content.replace(replace_item, '') |  | ||||||
|             for _ in range(100): |  | ||||||
|                 content = content.replace('\n\n\n', '\n\n') |  | ||||||
|         else: |  | ||||||
|             pass |  | ||||||
|         markdown_content = f"# {title}\n{content}" |  | ||||||
|         markdown_file_path = f"{title}.md" |  | ||||||
|         cleaned_filename = re.sub(r'[/:*?"<>|\'\\]', ' ', markdown_file_path) |  | ||||||
|         with open(cleaned_filename, 'w', encoding='utf-8') as md_file: |  | ||||||
|             md_file.write(markdown_content) |  | ||||||
|  |  | ||||||
| # 获取运行的日期和时间并写入文件 |  | ||||||
| def statistics_with_day_and_time(content='', filename='a', file_format='.txt'): |  | ||||||
|     import datetime |  | ||||||
|     datetime_today = str(datetime.date.today()) |  | ||||||
|     datetime_time = datetime.datetime.now().strftime('%H:%M:%S') |  | ||||||
|     with open(filename+file_format, 'a', encoding="utf-8") as f2: |  | ||||||
|        if content == '': |  | ||||||
|            f2.write(datetime_today+' '+datetime_time+'\n') |  | ||||||
|        else: |  | ||||||
|            f2.write(datetime_today+' '+datetime_time+' '+content+'\n') |  | ||||||
|  |  | ||||||
| # 统计Python文件中import的数量并排序 |  | ||||||
| def count_number_of_import_statements(filename, file_format='.py', num=1000): |  | ||||||
|     with open(filename+file_format, 'r') as file: |  | ||||||
|         lines = file.readlines() |  | ||||||
|     import_array = [] |  | ||||||
|     for line in lines: |  | ||||||
|         if 'import ' in line: |  | ||||||
|             line = line.strip() |  | ||||||
|             import_array.append(line) |  | ||||||
|     from collections import Counter |  | ||||||
|     import_statement_counter = Counter(import_array).most_common(num) |  | ||||||
|     return import_statement_counter |  | ||||||
|  |  | ||||||
| # 获取本月的所有日期 |  | ||||||
| def get_date_array_of_the_current_month(str_or_datetime='str'): |  | ||||||
|     import datetime |  | ||||||
|     today = datetime.date.today() |  | ||||||
|     first_day_of_month = today.replace(day=1) |  | ||||||
|     if first_day_of_month.month == 12: |  | ||||||
|         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) |  | ||||||
|     else: |  | ||||||
|         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) |  | ||||||
|     current_date = first_day_of_month |  | ||||||
|     date_array = [] |  | ||||||
|     while current_date < next_month: |  | ||||||
|         if str_or_datetime=='str': |  | ||||||
|             date_array.append(str(current_date)) |  | ||||||
|         elif str_or_datetime=='datetime': |  | ||||||
|             date_array.append(current_date) |  | ||||||
|         current_date += datetime.timedelta(days=1) |  | ||||||
|     return date_array |  | ||||||
|  |  | ||||||
| # 根据新的日期,填充数组中缺少的数据为零 |  | ||||||
| def fill_zero_data_for_new_dates(old_dates, new_dates, old_data_array): |  | ||||||
|     new_data_array = [] |  | ||||||
|     for date in new_dates: |  | ||||||
|         if str(date) not in old_dates: |  | ||||||
|             new_data_array.append(0) |  | ||||||
|         else: |  | ||||||
|             index = old_dates.index(date) |  | ||||||
|             new_data_array.append(old_data_array[index]) |  | ||||||
|     return new_data_array |  | ||||||
|  |  | ||||||
| # 获取上个月份 |  | ||||||
| def get_last_month(): |  | ||||||
|     import datetime |  | ||||||
|     today = datetime.date.today() |  | ||||||
|     last_month = today.month - 1 |  | ||||||
|     if last_month == 0: |  | ||||||
|         last_month = 12 |  | ||||||
|         year_of_last_month = today.year - 1 |  | ||||||
|     else: |  | ||||||
|         year_of_last_month = today.year |  | ||||||
|     return year_of_last_month, last_month |  | ||||||
|  |  | ||||||
| # 获取上上个月份 |  | ||||||
| def get_the_month_before_last(): |  | ||||||
|     import datetime |  | ||||||
|     today = datetime.date.today() |  | ||||||
|     the_month_before_last = today.month - 2 |  | ||||||
|     if the_month_before_last == 0: |  | ||||||
|         the_month_before_last = 12  |  | ||||||
|         year_of_the_month_before_last = today.year - 1 |  | ||||||
|     else: |  | ||||||
|         year_of_the_month_before_last = today.year |  | ||||||
|     if the_month_before_last == -1: |  | ||||||
|         the_month_before_last = 11 |  | ||||||
|         year_of_the_month_before_last = today.year - 1 |  | ||||||
|     else: |  | ||||||
|         year_of_the_month_before_last = today.year |  | ||||||
|     return year_of_the_month_before_last, the_month_before_last |  | ||||||
|  |  | ||||||
| # 获取上个月的所有日期 |  | ||||||
| def get_date_array_of_the_last_month(str_or_datetime='str'): |  | ||||||
|     import datetime |  | ||||||
|     import guan |  | ||||||
|     today = datetime.date.today() |  | ||||||
|     year_of_last_month, last_month = guan.get_last_month() |  | ||||||
|     first_day_of_month = today.replace(year=year_of_last_month, month=last_month, day=1) |  | ||||||
|     if first_day_of_month.month == 12: |  | ||||||
|         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) |  | ||||||
|     else: |  | ||||||
|         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) |  | ||||||
|     current_date = first_day_of_month |  | ||||||
|     date_array = [] |  | ||||||
|     while current_date < next_month: |  | ||||||
|         if str_or_datetime=='str': |  | ||||||
|             date_array.append(str(current_date)) |  | ||||||
|         elif str_or_datetime=='datetime': |  | ||||||
|             date_array.append(current_date) |  | ||||||
|         current_date += datetime.timedelta(days=1) |  | ||||||
|     return date_array |  | ||||||
|  |  | ||||||
| # 获取上上个月的所有日期 |  | ||||||
| def get_date_array_of_the_month_before_last(str_or_datetime='str'): |  | ||||||
|     import datetime |  | ||||||
|     import guan |  | ||||||
|     today = datetime.date.today() |  | ||||||
|     year_of_last_last_month, last_last_month = guan.get_the_month_before_last() |  | ||||||
|     first_day_of_month = today.replace(year=year_of_last_last_month, month=last_last_month, day=1) |  | ||||||
|     if first_day_of_month.month == 12: |  | ||||||
|         next_month = first_day_of_month.replace(year=first_day_of_month.year + 1, month=1) |  | ||||||
|     else: |  | ||||||
|         next_month = first_day_of_month.replace(month=first_day_of_month.month + 1) |  | ||||||
|     current_date = first_day_of_month |  | ||||||
|     date_array = [] |  | ||||||
|     while current_date < next_month: |  | ||||||
|         if str_or_datetime=='str': |  | ||||||
|             date_array.append(str(current_date)) |  | ||||||
|         elif str_or_datetime=='datetime': |  | ||||||
|             date_array.append(current_date) |  | ||||||
|         current_date += datetime.timedelta(days=1) |  | ||||||
|     return date_array |  | ||||||
|  |  | ||||||
| # 获取所有股票 |  | ||||||
| def all_stocks(): |  | ||||||
|     import numpy as np |  | ||||||
|     import akshare as ak |  | ||||||
|     stocks = ak.stock_zh_a_spot_em() |  | ||||||
|     title = np.array(stocks.columns) |  | ||||||
|     stock_data = stocks.values |  | ||||||
|     return title, stock_data |  | ||||||
|  |  | ||||||
| # 获取所有股票的代码 |  | ||||||
| def all_stock_symbols(): |  | ||||||
|     import guan |  | ||||||
|     title, stock_data = guan.all_stocks() |  | ||||||
|     stock_symbols = stock_data[:, 1] |  | ||||||
|     return stock_symbols |  | ||||||
|  |  | ||||||
| # 股票代码的分类 |  | ||||||
| def stock_symbols_classification(): |  | ||||||
|     import guan |  | ||||||
|     import re |  | ||||||
|     stock_symbols = guan.all_stock_symbols() |  | ||||||
|     # 上交所主板 |  | ||||||
|     stock_symbols_60 = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         find_600 = re.findall(r'^600', stock_symbol) |  | ||||||
|         find_601 = re.findall(r'^601', stock_symbol) |  | ||||||
|         find_603 = re.findall(r'^603', stock_symbol) |  | ||||||
|         find_605 = re.findall(r'^605', stock_symbol) |  | ||||||
|         if find_600 != [] or find_601 != [] or find_603 != [] or find_605 != []: |  | ||||||
|             stock_symbols_60.append(stock_symbol) |  | ||||||
|     # 深交所主板 |  | ||||||
|     stock_symbols_00 = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         find_000 = re.findall(r'^000', stock_symbol) |  | ||||||
|         find_001 = re.findall(r'^001', stock_symbol) |  | ||||||
|         find_002 = re.findall(r'^002', stock_symbol) |  | ||||||
|         find_003 = re.findall(r'^003', stock_symbol) |  | ||||||
|         if find_000 != [] or find_001 != [] or find_002 != [] or find_003 != []: |  | ||||||
|             stock_symbols_00.append(stock_symbol) |  | ||||||
|     # 创业板 |  | ||||||
|     stock_symbols_30 = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         find_300 = re.findall(r'^300', stock_symbol) |  | ||||||
|         find_301 = re.findall(r'^301', stock_symbol) |  | ||||||
|         if find_300 != [] or find_301 != []: |  | ||||||
|             stock_symbols_30.append(stock_symbol) |  | ||||||
|     # 科创板 |  | ||||||
|     stock_symbols_68 = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         find_688 = re.findall(r'^688', stock_symbol) |  | ||||||
|         find_689 = re.findall(r'^689', stock_symbol) |  | ||||||
|         if find_688 != [] or find_689 != []: |  | ||||||
|             stock_symbols_68.append(stock_symbol) |  | ||||||
|     # 新三板 |  | ||||||
|     stock_symbols_8_4 = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         find_82 = re.findall(r'^82', stock_symbol) |  | ||||||
|         find_83 = re.findall(r'^83', stock_symbol) |  | ||||||
|         find_87 = re.findall(r'^87', stock_symbol) |  | ||||||
|         find_88 = re.findall(r'^88', stock_symbol) |  | ||||||
|         find_430 = re.findall(r'^430', stock_symbol) |  | ||||||
|         find_420 = re.findall(r'^420', stock_symbol) |  | ||||||
|         find_400 = re.findall(r'^400', stock_symbol) |  | ||||||
|         if find_82 != [] or find_83 != [] or find_87 != [] or find_88 != [] or find_430 != [] or find_420 != [] or find_400 != []: |  | ||||||
|             stock_symbols_8_4.append(stock_symbol) |  | ||||||
|     # 检查遗漏的股票代码 |  | ||||||
|     stock_symbols_others = [] |  | ||||||
|     for stock_symbol in stock_symbols: |  | ||||||
|         if stock_symbol not in stock_symbols_60 and stock_symbol not in stock_symbols_00 and stock_symbol not in stock_symbols_30 and stock_symbol not in stock_symbols_68 and stock_symbol not in stock_symbols_8_4: |  | ||||||
|             stock_symbols_others.others.append(stock_symbol)  |  | ||||||
|     return stock_symbols_60, stock_symbols_00, stock_symbols_30, stock_symbols_68, stock_symbols_8_4, stock_symbols_others |  | ||||||
|  |  | ||||||
| # 股票代码各个分类的数量 |  | ||||||
| def statistics_of_stock_symbols_classification(): |  | ||||||
|     import guan |  | ||||||
|     stock_symbols_60, stock_symbols_00, stock_symbols_30, stock_symbols_68, stock_symbols_8_4, stock_symbols_others = guan.stock_symbols_classification() |  | ||||||
|     num_stocks_60 = len(stock_symbols_60) |  | ||||||
|     num_stocks_00 = len(stock_symbols_00) |  | ||||||
|     num_stocks_30 = len(stock_symbols_30) |  | ||||||
|     num_stocks_68 = len(stock_symbols_68) |  | ||||||
|     num_stocks_8_4 = len(stock_symbols_8_4) |  | ||||||
|     num_stocks_others= len(stock_symbols_others) |  | ||||||
|     return num_stocks_60, num_stocks_00, num_stocks_30, num_stocks_68, num_stocks_8_4, num_stocks_others |  | ||||||
|  |  | ||||||
| # 从股票代码获取股票名称 |  | ||||||
| def find_stock_name_from_symbol(symbol='000002'): |  | ||||||
|     import guan |  | ||||||
|     title, stock_data = guan.all_stocks() |  | ||||||
|     for stock in stock_data: |  | ||||||
|         if symbol in stock: |  | ||||||
|            stock_name = stock[2] |  | ||||||
|     return stock_name |  | ||||||
|  |  | ||||||
| # 市值排序 |  | ||||||
| def sorted_market_capitalization(num=10): |  | ||||||
|     import numpy as np |  | ||||||
|     import guan |  | ||||||
|     title, stock_data = guan.all_stocks() |  | ||||||
|     new_stock_data = [] |  | ||||||
|     for stock in stock_data: |  | ||||||
|         if np.isnan(float(stock[9])): |  | ||||||
|             continue |  | ||||||
|         else: |  | ||||||
|             new_stock_data.append(stock) |  | ||||||
|     new_stock_data = np.array(new_stock_data) |  | ||||||
|     list_index = np.argsort(new_stock_data[:, 17]) |  | ||||||
|     list_index = list_index[::-1] |  | ||||||
|     if num == None: |  | ||||||
|         num = len(list_index) |  | ||||||
|     sorted_array = [] |  | ||||||
|     for i0 in range(num): |  | ||||||
|         stock_symbol = new_stock_data[list_index[i0], 1] |  | ||||||
|         stock_name = new_stock_data[list_index[i0], 2] |  | ||||||
|         market_capitalization = new_stock_data[list_index[i0], 17]/1e8 |  | ||||||
|         sorted_array.append([i0+1, stock_symbol, stock_name, market_capitalization]) |  | ||||||
|     return sorted_array |  | ||||||
|  |  | ||||||
| # 美股市值排序 |  | ||||||
| def sorted_market_capitalization_us(num=10): |  | ||||||
|     import akshare as ak |  | ||||||
|     import numpy as np |  | ||||||
|     stocks = ak.stock_us_spot_em() |  | ||||||
|     stock_data = stocks.values |  | ||||||
|     new_stock_data = [] |  | ||||||
|     for stock in stock_data: |  | ||||||
|         if np.isnan(float(stock[9])): |  | ||||||
|             continue |  | ||||||
|         else: |  | ||||||
|             new_stock_data.append(stock) |  | ||||||
|     new_stock_data = np.array(new_stock_data) |  | ||||||
|     list_index = np.argsort(new_stock_data[:, 9]) |  | ||||||
|     list_index = list_index[::-1] |  | ||||||
|     if num == None: |  | ||||||
|         num = len(list_index) |  | ||||||
|     sorted_array = [] |  | ||||||
|     for i0 in range(num): |  | ||||||
|         stock_symbol = new_stock_data[list_index[i0], 15] |  | ||||||
|         stock_name = new_stock_data[list_index[i0], 1] |  | ||||||
|         market_capitalization = new_stock_data[list_index[i0], 9]/1e8 |  | ||||||
|         sorted_array.append([i0+1, stock_symbol, stock_name, market_capitalization]) |  | ||||||
|     return sorted_array |  | ||||||
|  |  | ||||||
| # 获取单个股票的历史数据 |  | ||||||
| def history_data_of_one_stock(symbol='000002', period='daily', start_date="19000101", end_date='21000101'): |  | ||||||
|     # period = 'daily' |  | ||||||
|     # period = 'weekly' |  | ||||||
|     # period = 'monthly' |  | ||||||
|     import numpy as np |  | ||||||
|     import akshare as ak |  | ||||||
|     stock = ak.stock_zh_a_hist(symbol=symbol, period=period, start_date=start_date, end_date=end_date) |  | ||||||
|     title = np.array(stock.columns) |  | ||||||
|     stock_data = stock.values[::-1] |  | ||||||
|     return title, stock_data |  | ||||||
|  |  | ||||||
| # 绘制股票图 |  | ||||||
| def plot_stock_line(date_array, opening_array, closing_array, high_array, low_array, lw_open_close=6, lw_high_low=2, xlabel='date', ylabel='price', title='', fontsize=20, labelsize=20, adjust_bottom=0.2, adjust_left=0.2, fontfamily='Times New Roman'): |  | ||||||
|     import guan |  | ||||||
|     plt, fig, ax = guan.import_plt_and_start_fig_ax(adjust_bottom=adjust_bottom, adjust_left=adjust_left, labelsize=labelsize, fontfamily=fontfamily) |  | ||||||
|     if fontfamily=='Times New Roman': |  | ||||||
|         ax.set_title(title, fontsize=fontsize, fontfamily='Times New Roman') |  | ||||||
|         ax.set_xlabel(xlabel, fontsize=fontsize, fontfamily='Times New Roman')  |  | ||||||
|         ax.set_ylabel(ylabel, fontsize=fontsize, fontfamily='Times New Roman') |  | ||||||
|     else: |  | ||||||
|         ax.set_title(title, fontsize=fontsize) |  | ||||||
|         ax.set_xlabel(xlabel, fontsize=fontsize) |  | ||||||
|         ax.set_ylabel(ylabel, fontsize=fontsize) |  | ||||||
|     for i0 in range(len(date_array)): |  | ||||||
|         if opening_array[i0] <= closing_array[i0]: |  | ||||||
|             ax.vlines(date_array[i0], opening_array[i0], closing_array[i0], linestyle='-', color='red', lw=lw_open_close) |  | ||||||
|             ax.vlines(date_array[i0], low_array[i0], high_array[i0], color='red', linestyle='-', lw=lw_high_low) |  | ||||||
|         else: |  | ||||||
|             ax.vlines(date_array[i0], opening_array[i0], closing_array[i0], linestyle='-', color='green', lw=lw_open_close) |  | ||||||
|             ax.vlines(date_array[i0], low_array[i0], high_array[i0], color='green', linestyle='-', lw=lw_high_low) |  | ||||||
|     plt.show() |  | ||||||
|     plt.close('all') |  | ||||||
|  |  | ||||||
| # 获取软件包中的所有模块名 |  | ||||||
| def get_all_modules_in_one_package(package_name='guan'): |  | ||||||
|     import pkgutil |  | ||||||
|     package = __import__(package_name) |  | ||||||
|     module_names = [name for _, name, _ in pkgutil.iter_modules(package.__path__)] |  | ||||||
|     return module_names |  | ||||||
|  |  | ||||||
| # 获取软件包中一个模块的所有函数名 |  | ||||||
| def get_all_functions_in_one_module(module_name, package_name='guan'): |  | ||||||
|     import inspect |  | ||||||
|     function_names = [] |  | ||||||
|     module = __import__(f"{package_name}.{module_name}", fromlist=[""]) |  | ||||||
|     for name, obj in inspect.getmembers(module): |  | ||||||
|         if inspect.isfunction(obj): |  | ||||||
|             function_names.append(name) |  | ||||||
|     return function_names |  | ||||||
|  |  | ||||||
| # 获取软件包中的所有函数名 |  | ||||||
| def get_all_functions_in_one_package(package_name='guan', print_show=1): |  | ||||||
|     import guan |  | ||||||
|     module_names = guan.get_all_modules_in_one_package(package_name=package_name) |  | ||||||
|     all_function_names = [] |  | ||||||
|     for module_name in module_names: |  | ||||||
|         function_names = guan.get_all_functions_in_one_module(module_name, package_name='guan') |  | ||||||
|         if print_show == 1: |  | ||||||
|             print('Module:', module_name) |  | ||||||
|         for name in function_names: |  | ||||||
|             all_function_names.append(name) |  | ||||||
|             if print_show == 1: |  | ||||||
|                 print('function:', name) |  | ||||||
|         if print_show == 1: |  | ||||||
|             print() |  | ||||||
|     return all_function_names |  | ||||||
|  |  | ||||||
| # 获取包含某个字符的进程PID值 |  | ||||||
| def get_PID_array(name): |  | ||||||
|     import subprocess |  | ||||||
|     command = "ps -ef | grep "+name |  | ||||||
|     result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) |  | ||||||
|     if result.returncode == 0: |  | ||||||
|         ps_ef = result.stdout |  | ||||||
|     import re |  | ||||||
|     ps_ef_1 = re.split(r'\n', ps_ef) |  | ||||||
|     id_running_array = [] |  | ||||||
|     for ps_ef_item in ps_ef_1: |  | ||||||
|         if ps_ef_item != '': |  | ||||||
|             ps_ef_2 = re.split(r'\s+', ps_ef_item) |  | ||||||
|             id_running_array.append(ps_ef_2[1]) |  | ||||||
|     return id_running_array |  | ||||||
|  |  | ||||||
| # 查找文件名相同的文件 |  | ||||||
| def find_repeated_file_with_same_filename(directory='./', ignored_directory_with_words=[], ignored_file_with_words=[], num=1000): |  | ||||||
|     import os |  | ||||||
|     from collections import Counter |  | ||||||
|     file_list = [] |  | ||||||
|     for root, dirs, files in os.walk(directory): |  | ||||||
|         for i0 in range(len(files)): |  | ||||||
|             file_list.append(files[i0]) |  | ||||||
|             for word in ignored_directory_with_words: |  | ||||||
|                 if word in root: |  | ||||||
|                     file_list.remove(files[i0])        |  | ||||||
|             for word in ignored_file_with_words: |  | ||||||
|                 if word in files[i0]: |  | ||||||
|                     try: |  | ||||||
|                         file_list.remove(files[i0])    |  | ||||||
|                     except: |  | ||||||
|                         pass  |  | ||||||
|     count_file = Counter(file_list).most_common(num) |  | ||||||
|     repeated_file = [] |  | ||||||
|     for item in count_file: |  | ||||||
|         if item[1]>1: |  | ||||||
|             repeated_file.append(item) |  | ||||||
|     return repeated_file |  | ||||||
|  |  | ||||||
| # 统计各个子文件夹中的文件数量 |  | ||||||
| def count_file_in_sub_directory(directory='./', sort=0, reverse=1, print_show=1, smaller_than_num=None): |  | ||||||
|     import os |  | ||||||
|     import numpy as np |  | ||||||
|     dirs_list = [] |  | ||||||
|     for root, dirs, files in os.walk(directory): |  | ||||||
|         if dirs != []: |  | ||||||
|             for i0 in range(len(dirs)): |  | ||||||
|                 dirs_list.append(root+'/'+dirs[i0]) |  | ||||||
|     count_file_array = [] |  | ||||||
|     for sub_dir in dirs_list: |  | ||||||
|         file_list = [] |  | ||||||
|         for root, dirs, files in os.walk(sub_dir): |  | ||||||
|             for i0 in range(len(files)): |  | ||||||
|                 file_list.append(files[i0]) |  | ||||||
|         count_file = len(file_list) |  | ||||||
|         count_file_array.append(count_file) |  | ||||||
|         if sort == 0: |  | ||||||
|             if print_show == 1: |  | ||||||
|                 if smaller_than_num == None: |  | ||||||
|                     print(sub_dir) |  | ||||||
|                     print(count_file) |  | ||||||
|                     print() |  | ||||||
|                 else: |  | ||||||
|                     if count_file<smaller_than_num: |  | ||||||
|                         print(sub_dir) |  | ||||||
|                         print(count_file) |  | ||||||
|                         print() |  | ||||||
|     if sort == 0: |  | ||||||
|         sub_directory = dirs_list |  | ||||||
|         num_in_sub_directory = count_file_array |  | ||||||
|     if sort == 1: |  | ||||||
|         sub_directory = [] |  | ||||||
|         num_in_sub_directory = [] |  | ||||||
|         if reverse == 1: |  | ||||||
|             index_array = np.argsort(count_file_array)[::-1] |  | ||||||
|         else: |  | ||||||
|             index_array = np.argsort(count_file_array) |  | ||||||
|         for i0 in index_array: |  | ||||||
|             sub_directory.append(dirs_list[i0]) |  | ||||||
|             num_in_sub_directory.append(count_file_array[i0]) |  | ||||||
|             if print_show == 1: |  | ||||||
|                 if smaller_than_num == None: |  | ||||||
|                     print(dirs_list[i0]) |  | ||||||
|                     print(count_file_array[i0]) |  | ||||||
|                     print() |  | ||||||
|                 else: |  | ||||||
|                     if count_file_array[i0]<smaller_than_num: |  | ||||||
|                         print(dirs_list[i0]) |  | ||||||
|                         print(count_file_array[i0]) |  | ||||||
|                         print() |  | ||||||
|     return sub_directory, num_in_sub_directory |  | ||||||
|  |  | ||||||
| # 在多个子文件夹中产生必要的文件,例如 readme.md |  | ||||||
| def creat_necessary_file(directory, filename='readme', file_format='.md', content='', overwrite=None, ignored_directory_with_words=[]): |  | ||||||
|     import os |  | ||||||
|     directory_with_file = [] |  | ||||||
|     ignored_directory = [] |  | ||||||
|     for root, dirs, files in os.walk(directory): |  | ||||||
|         for i0 in range(len(files)): |  | ||||||
|             if root not in directory_with_file: |  | ||||||
|                 directory_with_file.append(root) |  | ||||||
|             if files[i0] == filename+file_format: |  | ||||||
|                 if root not in ignored_directory: |  | ||||||
|                     ignored_directory.append(root) |  | ||||||
|     if overwrite == None: |  | ||||||
|         for root in ignored_directory: |  | ||||||
|             directory_with_file.remove(root) |  | ||||||
|     ignored_directory_more =[] |  | ||||||
|     for root in directory_with_file:  |  | ||||||
|         for word in ignored_directory_with_words: |  | ||||||
|             if word in root: |  | ||||||
|                 if root not in ignored_directory_more: |  | ||||||
|                     ignored_directory_more.append(root) |  | ||||||
|     for root in ignored_directory_more: |  | ||||||
|         directory_with_file.remove(root)  |  | ||||||
|     for root in directory_with_file: |  | ||||||
|         os.chdir(root) |  | ||||||
|         f = open(filename+file_format, 'w', encoding="utf-8") |  | ||||||
|         f.write(content) |  | ||||||
|         f.close() |  | ||||||
|  |  | ||||||
| # 删除特定文件名的文件(谨慎使用) |  | ||||||
| def delete_file_with_specific_name(directory, filename='readme', file_format='.md'): |  | ||||||
|     import os |  | ||||||
|     for root, dirs, files in os.walk(directory): |  | ||||||
|         for i0 in range(len(files)): |  | ||||||
|             if files[i0] == filename+file_format: |  | ||||||
|                 os.remove(root+'/'+files[i0]) |  | ||||||
|  |  | ||||||
| # 将所有文件移到根目录(谨慎使用) |  | ||||||
| def move_all_files_to_root_directory(directory): |  | ||||||
|     import os |  | ||||||
|     import shutil |  | ||||||
|     for root, dirs, files in os.walk(directory): |  | ||||||
|         for i0 in range(len(files)): |  | ||||||
|             shutil.move(root+'/'+files[i0], directory+'/'+files[i0]) |  | ||||||
|     for i0 in range(100): |  | ||||||
|         for root, dirs, files in os.walk(directory): |  | ||||||
|             try: |  | ||||||
|                 os.rmdir(root)  |  | ||||||
|             except: |  | ||||||
|                 pass |  | ||||||
|  |  | ||||||
| # 将文件目录结构写入Markdown文件 | # 将文件目录结构写入Markdown文件 | ||||||
| def write_file_list_in_markdown(directory='./', filename='a', reverse_positive_or_negative=1, starting_from_h1=None, banned_file_format=[], hide_file_format=None, divided_line=None, show_second_number=None, show_third_number=None):  | def write_file_list_in_markdown(directory='./', filename='a', reverse_positive_or_negative=1, starting_from_h1=None, banned_file_format=[], hide_file_format=None, divided_line=None, show_second_number=None, show_third_number=None):  | ||||||
|     import os |     import os | ||||||
| @@ -952,45 +444,220 @@ def compress_wav_to_mp3(wav_path, output_filename='a.mp3', bitrate='16k'): | |||||||
|     sound = AudioSegment.from_mp3(wav_path) |     sound = AudioSegment.from_mp3(wav_path) | ||||||
|     sound.export(output_filename,format="mp3",bitrate=bitrate) |     sound.export(output_filename,format="mp3",bitrate=bitrate) | ||||||
|  |  | ||||||
| # 获取MAC地址 | # 将WordPress导出的XML格式文件转换成多个MarkDown格式的文件 | ||||||
| def get_mac_address(): | def convert_wordpress_xml_to_markdown(xml_file='./a.xml', convert_content=1, replace_more=[]): | ||||||
|     import uuid |     import xml.etree.ElementTree as ET | ||||||
|     mac_address = uuid.UUID(int=uuid.getnode()).hex[-12:].upper() |     import re | ||||||
|     mac_address = '-'.join([mac_address[i:i+2] for i in range(0, 11, 2)]) |     tree = ET.parse(xml_file) | ||||||
|     return mac_address |     root = tree.getroot() | ||||||
|  |     for item in root.findall('.//item'): | ||||||
|  |         title = item.find('title').text | ||||||
|  |         content = item.find('.//content:encoded', namespaces={'content': 'http://purl.org/rss/1.0/modules/content/'}).text | ||||||
|  |         if convert_content == 1: | ||||||
|  |             content = re.sub(r'<!--.*?-->', '', content) | ||||||
|  |             content = content.replace('<p>', '') | ||||||
|  |             content = content.replace('</p>', '') | ||||||
|  |             content = content.replace('<ol>', '') | ||||||
|  |             content = content.replace('</ol>', '') | ||||||
|  |             content = content.replace('<ul>', '') | ||||||
|  |             content = content.replace('</ul>', '') | ||||||
|  |             content = content.replace('<strong>', '') | ||||||
|  |             content = content.replace('</strong>', '') | ||||||
|  |             content = content.replace('</li>', '') | ||||||
|  |             content = content.replace('<li>', '+ ') | ||||||
|  |             content = content.replace('</h3>', '') | ||||||
|  |             content = re.sub(r'<h2.*?>', '## ', content) | ||||||
|  |             content = re.sub(r'<h3.*?>', '### ', content) | ||||||
|  |             content = re.sub(r'<h4.*?>', '#### ', content) | ||||||
|  |             for replace_item in replace_more: | ||||||
|  |                 content = content.replace(replace_item, '') | ||||||
|  |             for _ in range(100): | ||||||
|  |                 content = content.replace('\n\n\n', '\n\n') | ||||||
|  |         else: | ||||||
|  |             pass | ||||||
|  |         markdown_content = f"# {title}\n{content}" | ||||||
|  |         markdown_file_path = f"{title}.md" | ||||||
|  |         cleaned_filename = re.sub(r'[/:*?"<>|\'\\]', ' ', markdown_file_path) | ||||||
|  |         with open(cleaned_filename, 'w', encoding='utf-8') as md_file: | ||||||
|  |             md_file.write(markdown_content) | ||||||
|  |  | ||||||
| # 获取调用本函数的函数名 | # 获取所有股票 | ||||||
| def get_calling_function_name(layer=1): | def all_stocks(): | ||||||
|     import inspect |     import numpy as np | ||||||
|     caller = inspect.stack()[layer] |     import akshare as ak | ||||||
|     calling_function_name = caller.function |     stocks = ak.stock_zh_a_spot_em() | ||||||
|     return calling_function_name |     title = np.array(stocks.columns) | ||||||
|  |     stock_data = stocks.values | ||||||
|  |     return title, stock_data | ||||||
|  |  | ||||||
| # 获取Python软件包的最新版本 | # 获取所有股票的代码 | ||||||
| def get_latest_version(package_name='guan', timeout=5): | def all_stock_symbols(): | ||||||
|     import requests |     import guan | ||||||
|     url = f"https://pypi.org/pypi/{package_name}/json" |     title, stock_data = guan.all_stocks() | ||||||
|     try: |     stock_symbols = stock_data[:, 1] | ||||||
|         response = requests.get(url, timeout=timeout) |     return stock_symbols | ||||||
|     except: |  | ||||||
|         return None | # 股票代码的分类 | ||||||
|     if response.status_code == 200: | def stock_symbols_classification(): | ||||||
|         data = response.json() |     import guan | ||||||
|         latest_version = data["info"]["version"] |     import re | ||||||
|         return latest_version |     stock_symbols = guan.all_stock_symbols() | ||||||
|  |     # 上交所主板 | ||||||
|  |     stock_symbols_60 = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         find_600 = re.findall(r'^600', stock_symbol) | ||||||
|  |         find_601 = re.findall(r'^601', stock_symbol) | ||||||
|  |         find_603 = re.findall(r'^603', stock_symbol) | ||||||
|  |         find_605 = re.findall(r'^605', stock_symbol) | ||||||
|  |         if find_600 != [] or find_601 != [] or find_603 != [] or find_605 != []: | ||||||
|  |             stock_symbols_60.append(stock_symbol) | ||||||
|  |     # 深交所主板 | ||||||
|  |     stock_symbols_00 = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         find_000 = re.findall(r'^000', stock_symbol) | ||||||
|  |         find_001 = re.findall(r'^001', stock_symbol) | ||||||
|  |         find_002 = re.findall(r'^002', stock_symbol) | ||||||
|  |         find_003 = re.findall(r'^003', stock_symbol) | ||||||
|  |         if find_000 != [] or find_001 != [] or find_002 != [] or find_003 != []: | ||||||
|  |             stock_symbols_00.append(stock_symbol) | ||||||
|  |     # 创业板 | ||||||
|  |     stock_symbols_30 = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         find_300 = re.findall(r'^300', stock_symbol) | ||||||
|  |         find_301 = re.findall(r'^301', stock_symbol) | ||||||
|  |         if find_300 != [] or find_301 != []: | ||||||
|  |             stock_symbols_30.append(stock_symbol) | ||||||
|  |     # 科创板 | ||||||
|  |     stock_symbols_68 = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         find_688 = re.findall(r'^688', stock_symbol) | ||||||
|  |         find_689 = re.findall(r'^689', stock_symbol) | ||||||
|  |         if find_688 != [] or find_689 != []: | ||||||
|  |             stock_symbols_68.append(stock_symbol) | ||||||
|  |     # 新三板 | ||||||
|  |     stock_symbols_8_4 = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         find_82 = re.findall(r'^82', stock_symbol) | ||||||
|  |         find_83 = re.findall(r'^83', stock_symbol) | ||||||
|  |         find_87 = re.findall(r'^87', stock_symbol) | ||||||
|  |         find_88 = re.findall(r'^88', stock_symbol) | ||||||
|  |         find_430 = re.findall(r'^430', stock_symbol) | ||||||
|  |         find_420 = re.findall(r'^420', stock_symbol) | ||||||
|  |         find_400 = re.findall(r'^400', stock_symbol) | ||||||
|  |         if find_82 != [] or find_83 != [] or find_87 != [] or find_88 != [] or find_430 != [] or find_420 != [] or find_400 != []: | ||||||
|  |             stock_symbols_8_4.append(stock_symbol) | ||||||
|  |     # 检查遗漏的股票代码 | ||||||
|  |     stock_symbols_others = [] | ||||||
|  |     for stock_symbol in stock_symbols: | ||||||
|  |         if stock_symbol not in stock_symbols_60 and stock_symbol not in stock_symbols_00 and stock_symbol not in stock_symbols_30 and stock_symbol not in stock_symbols_68 and stock_symbol not in stock_symbols_8_4: | ||||||
|  |             stock_symbols_others.others.append(stock_symbol)  | ||||||
|  |     return stock_symbols_60, stock_symbols_00, stock_symbols_30, stock_symbols_68, stock_symbols_8_4, stock_symbols_others | ||||||
|  |  | ||||||
|  | # 股票代码各个分类的数量 | ||||||
|  | def statistics_of_stock_symbols_classification(): | ||||||
|  |     import guan | ||||||
|  |     stock_symbols_60, stock_symbols_00, stock_symbols_30, stock_symbols_68, stock_symbols_8_4, stock_symbols_others = guan.stock_symbols_classification() | ||||||
|  |     num_stocks_60 = len(stock_symbols_60) | ||||||
|  |     num_stocks_00 = len(stock_symbols_00) | ||||||
|  |     num_stocks_30 = len(stock_symbols_30) | ||||||
|  |     num_stocks_68 = len(stock_symbols_68) | ||||||
|  |     num_stocks_8_4 = len(stock_symbols_8_4) | ||||||
|  |     num_stocks_others= len(stock_symbols_others) | ||||||
|  |     return num_stocks_60, num_stocks_00, num_stocks_30, num_stocks_68, num_stocks_8_4, num_stocks_others | ||||||
|  |  | ||||||
|  | # 从股票代码获取股票名称 | ||||||
|  | def find_stock_name_from_symbol(symbol='000002'): | ||||||
|  |     import guan | ||||||
|  |     title, stock_data = guan.all_stocks() | ||||||
|  |     for stock in stock_data: | ||||||
|  |         if symbol in stock: | ||||||
|  |            stock_name = stock[2] | ||||||
|  |     return stock_name | ||||||
|  |  | ||||||
|  | # 市值排序 | ||||||
|  | def sorted_market_capitalization(num=10): | ||||||
|  |     import numpy as np | ||||||
|  |     import guan | ||||||
|  |     title, stock_data = guan.all_stocks() | ||||||
|  |     new_stock_data = [] | ||||||
|  |     for stock in stock_data: | ||||||
|  |         if np.isnan(float(stock[9])): | ||||||
|  |             continue | ||||||
|  |         else: | ||||||
|  |             new_stock_data.append(stock) | ||||||
|  |     new_stock_data = np.array(new_stock_data) | ||||||
|  |     list_index = np.argsort(new_stock_data[:, 17]) | ||||||
|  |     list_index = list_index[::-1] | ||||||
|  |     if num == None: | ||||||
|  |         num = len(list_index) | ||||||
|  |     sorted_array = [] | ||||||
|  |     for i0 in range(num): | ||||||
|  |         stock_symbol = new_stock_data[list_index[i0], 1] | ||||||
|  |         stock_name = new_stock_data[list_index[i0], 2] | ||||||
|  |         market_capitalization = new_stock_data[list_index[i0], 17]/1e8 | ||||||
|  |         sorted_array.append([i0+1, stock_symbol, stock_name, market_capitalization]) | ||||||
|  |     return sorted_array | ||||||
|  |  | ||||||
|  | # 美股市值排序 | ||||||
|  | def sorted_market_capitalization_us(num=10): | ||||||
|  |     import akshare as ak | ||||||
|  |     import numpy as np | ||||||
|  |     stocks = ak.stock_us_spot_em() | ||||||
|  |     stock_data = stocks.values | ||||||
|  |     new_stock_data = [] | ||||||
|  |     for stock in stock_data: | ||||||
|  |         if np.isnan(float(stock[9])): | ||||||
|  |             continue | ||||||
|  |         else: | ||||||
|  |             new_stock_data.append(stock) | ||||||
|  |     new_stock_data = np.array(new_stock_data) | ||||||
|  |     list_index = np.argsort(new_stock_data[:, 9]) | ||||||
|  |     list_index = list_index[::-1] | ||||||
|  |     if num == None: | ||||||
|  |         num = len(list_index) | ||||||
|  |     sorted_array = [] | ||||||
|  |     for i0 in range(num): | ||||||
|  |         stock_symbol = new_stock_data[list_index[i0], 15] | ||||||
|  |         stock_name = new_stock_data[list_index[i0], 1] | ||||||
|  |         market_capitalization = new_stock_data[list_index[i0], 9]/1e8 | ||||||
|  |         sorted_array.append([i0+1, stock_symbol, stock_name, market_capitalization]) | ||||||
|  |     return sorted_array | ||||||
|  |  | ||||||
|  | # 获取单个股票的历史数据 | ||||||
|  | def history_data_of_one_stock(symbol='000002', period='daily', start_date="19000101", end_date='21000101'): | ||||||
|  |     # period = 'daily' | ||||||
|  |     # period = 'weekly' | ||||||
|  |     # period = 'monthly' | ||||||
|  |     import numpy as np | ||||||
|  |     import akshare as ak | ||||||
|  |     stock = ak.stock_zh_a_hist(symbol=symbol, period=period, start_date=start_date, end_date=end_date) | ||||||
|  |     title = np.array(stock.columns) | ||||||
|  |     stock_data = stock.values[::-1] | ||||||
|  |     return title, stock_data | ||||||
|  |  | ||||||
|  | # 绘制股票图 | ||||||
|  | def plot_stock_line(date_array, opening_array, closing_array, high_array, low_array, lw_open_close=6, lw_high_low=2, xlabel='date', ylabel='price', title='', fontsize=20, labelsize=20, adjust_bottom=0.2, adjust_left=0.2, fontfamily='Times New Roman'): | ||||||
|  |     import guan | ||||||
|  |     plt, fig, ax = guan.import_plt_and_start_fig_ax(adjust_bottom=adjust_bottom, adjust_left=adjust_left, labelsize=labelsize, fontfamily=fontfamily) | ||||||
|  |     if fontfamily=='Times New Roman': | ||||||
|  |         ax.set_title(title, fontsize=fontsize, fontfamily='Times New Roman') | ||||||
|  |         ax.set_xlabel(xlabel, fontsize=fontsize, fontfamily='Times New Roman')  | ||||||
|  |         ax.set_ylabel(ylabel, fontsize=fontsize, fontfamily='Times New Roman') | ||||||
|     else: |     else: | ||||||
|         return None |         ax.set_title(title, fontsize=fontsize) | ||||||
|  |         ax.set_xlabel(xlabel, fontsize=fontsize) | ||||||
|  |         ax.set_ylabel(ylabel, fontsize=fontsize) | ||||||
|  |     for i0 in range(len(date_array)): | ||||||
|  |         if opening_array[i0] <= closing_array[i0]: | ||||||
|  |             ax.vlines(date_array[i0], opening_array[i0], closing_array[i0], linestyle='-', color='red', lw=lw_open_close) | ||||||
|  |             ax.vlines(date_array[i0], low_array[i0], high_array[i0], color='red', linestyle='-', lw=lw_high_low) | ||||||
|  |         else: | ||||||
|  |             ax.vlines(date_array[i0], opening_array[i0], closing_array[i0], linestyle='-', color='green', lw=lw_open_close) | ||||||
|  |             ax.vlines(date_array[i0], low_array[i0], high_array[i0], color='green', linestyle='-', lw=lw_high_low) | ||||||
|  |     plt.show() | ||||||
|  |     plt.close('all') | ||||||
|  |  | ||||||
| # 获取软件包的本机版本 | # Guan软件包升级检查和提示(如果无法连接或者版本为最新,那么均没有提示) | ||||||
| def get_current_version(package_name='guan'): |  | ||||||
|     import importlib.metadata |  | ||||||
|     try: |  | ||||||
|         current_version = importlib.metadata.version(package_name) |  | ||||||
|         return current_version |  | ||||||
|     except: |  | ||||||
|         return None |  | ||||||
|  |  | ||||||
| # Guan软件包升级检查和提示 |  | ||||||
| def notification_of_upgrade(timeout=5): | def notification_of_upgrade(timeout=5): | ||||||
|     try: |     try: | ||||||
|         import guan |         import guan | ||||||
| @@ -1002,7 +669,7 @@ def notification_of_upgrade(timeout=5): | |||||||
|     except: |     except: | ||||||
|         pass |         pass | ||||||
|  |  | ||||||
| # Guan软件包的使用统计 | # Guan软件包的使用统计(仅仅统计装机数和import次数) | ||||||
| def statistics_of_guan_package(function_name=None): | def statistics_of_guan_package(function_name=None): | ||||||
|     import guan |     import guan | ||||||
|     try: |     try: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user