非常有必要记录一下最近遇到的坑
而以下实际上是一个报错列表
首先是小澎湃鼎力相助帮我弄的多进程,然后还预告了一下可能要升级Python版本,然后果不其然,我是3.7.2然后运行多进程代码之后,报错return self._semlock.exit(*args) OSError: [WinError 6] 句柄无效。
然后搜索这个错误发现解决方案很少,因此按照小澎湃说的先升级一下python版本,升级到3.9.0。
具体是,3.7.2的exe点uninstall,之后去阿里镜像下载,官网就是转圈圈(http://npm.taobao.org/mirrors/python/3.9.1/),所以还是安装到C盘比较OK一点。
然后欢天喜地升级了Python之后,结果定义的主函数没有运行完。
path = "D:\\images\\"
dir_path = "D:\\images"
downloaded_images = []
process_pool = ProcessPoolExecutor(max_workers=multiprocessing.cpu_count()) # 使用进程池 同时处理cpu个数的任务
def get_feature_and_insert(image_file_name, index): # 处理图片主函数
conn = pymysql.connect(host='116.62.120.194', port=3306, user='root', password='FXzmCSzs666',
database='test') # charset='utf8'
cs = conn.cursor() # 获取游标
print('阶段1')
media_id = image_file_name.split('.')[0]
image_path = path + image_file_name
file = open(image_path, 'rb')
image_file = Image.open(file)
image = np.asarray(image_file)
Colorfulness = image_colorfulness(image) # 图片色彩丰富度
width, height, WH = image_size(image)
print('阶段2')
avg_h, WarmHue, avg_s, std_s, avg_v, std_v, Clarity = image_colorfeatures(image)
Num_contours, RT_score, Dia_score, VBI_score, VBC_score, Size_difference_score1,Size_difference_score3, Color_difference_score, Texture_difference_score = image_features(image)
print('阶段3')
sql = 'insert into tt(r,mediaId,photourl,avg_h,WarmHue,avg_s,std_s,avg_v,std_v,' \
'Clarity,Colorfulness,RT_score,Dia_score,VBI_score,Size_score1,' \
'Size_score3,Color_score,Texture_score,width,height,WH) values(%s,%s,%s,' \
'%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
get_url_sql = f'select photourl from image_en where mediaId = {media_id}' # 本地没有保存Url,从数据库中查询
cs.execute(get_url_sql)
image_url = cs.fetchone()[0]
print(f'mediaId = {media_id} url = {image_url}')
cs.execute(sql, (index, media_id, image_url, avg_h, WarmHue, avg_s, std_s, avg_v, std_v,
Clarity, Colorfulness, RT_score, Dia_score, VBI_score, Size_difference_score1,
Size_difference_score3, Color_difference_score, Texture_difference_score, width, height, WH))
conn.commit() # 提交
cs.close()
conn.close()
print('入数据')
if __name__ == '__main__':
start_time = time.time() # time1
print('开始处理')
if not os.path.exists(dir_path):
print("未找到图片,请检查图片路径")
else:
downloaded_images = os.listdir(dir_path)
i = 0
all_num = 3
for image_name in downloaded_images:
i += 1
# get_feature_and_insert(image_name, i) # 使用单进程
process_pool.submit(get_feature_and_insert, image_name, i) # 使用多进程
if i == all_num: # 先跑10个看看速度
break
process_pool.shutdown(wait=True)
print('处理完毕')
就是运行,发现这个get_featurea_and_insert这个函数中的输出的结果是阶段1.阶段2可以输出,然后阶段3及以后的内容根本没有执行,去数据库中也找不到插入的数据,真自抱自泣。然后以为是没有升级到最近的Python所以又卸载3.9.0然后安装了3.9.1然后还是一样的,就是后面怎么都不执行。所以是不是多进程那个函数的长度有限制呢?还是我的老古董电脑太破了呢红红蓝蓝紫紫都摇头
然后之前看视频有提到pool.map的用法,所以反正都是执行不了,不如一试,更新的代码如下
在此过程中,出现报错
return _pool.map(star(f), zip(*args)) # chunksize TypeError: ‘int’ object is not interable
按照教程 python多进程中多参数问题
https://blog.csdn.net/weixin_37913042/article/details/100559873
必须要输入的参数是列表,可迭代的,因此修改代码如下
if __name__ == '__main__':
start_time = time.time() # time1
print('开始处理')
if not os.path.exists(dir_path):
print("未找到图片,请检查图片路径")
else:
downloaded_images = os.listdir(dir_path)
index_list=[]
all_num=3
for i in range(1,all_num+1):
index_list.append(i)
pool=Pool(4)
pool.map(get_feature_and_insert,downloaded_images,index_list) #新写的多进程部分
print('处理完毕')
然后继续报错
AttributeError: module ‘cv2.cv2’ has no attribute ‘saliency’[SOLVED]
参考博文
https://blog.csdn.net/hopena/article/details/91350271
原来是我的包没有下全,所以在ternimal中下载此包
D:\PycharmWorkSpace\pic_feature>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv_contrib_python
然后就能正常执行了我天!!!欢呼撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。
然后用最开始的小澎湃多进程的程序跑也能跑出来了,数据库写入正常,所以刚开始只是缺少了一个包,但程序没有报出这个错误真的太隐蔽了也。。。
最后再次感谢小澎湃的帮忙,鞠躬~~~~~~