linux select使用(转)

本文详细介绍了Linux系统中select系统调用的功能和使用方法,包括如何监视文件句柄的状态变化,以及如何设置超时时间。并通过具体示例展示了如何使用select来检测标准输入和网络套接字的状态。
select系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。文件在句柄在Linux里很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件句柄被创建的都是的,如man socket可以看到“On success, a file descriptor for the new socket is returned.”而man 2 open可以看到“open() and creat() return the new file descriptor”,其实文件句柄就是一个整数,看socket函数的声明就明白了:

int socket(int domain, int type, int protocol);

当然,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr,0就是stdin,1就是stdout,2就是stderr。比如下面这两段代码都是从标准输入读入9个字节字符:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

int main(int argc, char ** argv)

{??????

char buf[10] = "";???????

read(0, buf, 9); ???????

fprintf(stdout, "%s\n", buf); ??????

return 0;

}



#include <stdio.h>

#include <unistd.h>

#include <string.h>

int main(int argc, char ** argv)

{???????

char buf[10] = "";???????

fread(buf, 9, 1, stdin); ???????

write(1, buf, strlen(buf));???????

return 0;

}

继续上面说的select,就是用来监视某个或某些句柄的状态变化的。

select函数原型如下:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

函 数的最后一个参数timeout显然是一个超时时间值,其类型是struct timeval *,即一个struct timeval结构的变量的指针,所以我们在程序里要申明一个struct timeval tv;然后把变量tv的地址&tv传递给select函数。struct timeval结构如下:

struct timeval

{????????????

long??? tv_sec;???????? ????????????

long??? tv_usec;??????? ????????

};

第2、 3、4三个参数是一样的类型: fd_set *,即我们在程序里要申明几个fd_set类型的变量,比如rdfds, wtfds, exfds,然后把这个变量的地址&rdfds, &wtfds, &exfds 传递给select函数。

这三个参数都是一个句柄的集合,第一个rdfds是用来保存这样的句柄的:当句柄的状态变成可读的时系统就会告诉select函数返回,同理第二个 wtfds是指有句柄状态变成可写的时系统就会告诉select函数返回,同理第三个参数exfds是特殊情况,即句柄上有特殊情况发生时系统会告诉 select函数返回。特殊情况比如对方通过一个socket句柄发来了紧急数据。如果我们程序里只想检测某个socket是否有数据可读,我们可以这样:

fd_set rdfds;

struct timeval tv;

int ret;

FD_ZERO(&rdfds);

FD_SET(socket, &rdfds);

tv.tv_sec = 1;

tv.tv_usec = 500;

ret = select(socket + 1, &rdfds, NULL, NULL, &tv);

if(ret < 0)

perror("select");

else if(ret == 0)

printf("超时\n");

else

{ ???

printf("ret=%d\n", ret);

??

if(FD_ISSET(socket, &rdfds)) { ???????

???????

recv(...);???

}

}

注意select函数的第一个参数,是所有加入集合的句柄值的最大那个值还要加1。比如我们创建了3个句柄:

int sa, sb, sc;

sa = socket(...);

connect(sa,...);

sb = socket(...);

connect(sb,...);

sc = socket(...);

connect(sc,...);

FD_SET(sa, &rdfds);

FD_SET(sb, &rdfds);

FD_SET(sc, &rdfds);

在使用select函数之前,一定要找到3个句柄中的最大值是哪个,我们一般定义一个变量来保存最大值,取得最大socket值如下:

int maxfd = 0;

if(sa > maxfd)

maxfd = sa;

if(sb > maxfd)

maxfd = sb;

if(sc > maxfd)

maxfd = sc;

然后调用select函数:

ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv);

同样的道理,如果我们要检测用户是否按了键盘进行输入,我们就应该把标准输入0这个句柄放到select里来检测,如下:

FD_ZERO(&rdfds);

FD_SET(0, &rdfds);

tv.tv_sec = 1;

tv.tv_usec = 0;

ret = select(1, &rdfds, NULL, NULL, &tv);

if(ret < 0)

perror("select");

else if(ret == 0)

printf("超时\n");

else { ??

scanf("%s", buf); }

---------------------------------------------------------------------------------------------------------------------------------

select(I/O多工机制)
表头文件 #i nclude
#i nclude
#i nclude

定义函数 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);

函数说明 select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds 和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。底下的宏提供了处理这三种描述词组的方式:
FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd 的位是否为真
FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位
FD_ZERO(fd_set *set);用来清除描述词组set的全部位

参数 timeout为结构timeval,用来设置select()的等待时间,其结构定义如下
struct timeval
{
time_t tv_sec;
time_t tv_usec;
};

返回值 如果参数timeout设为NULL则表示select()没有timeout。

错误代码 执行成功则返回文件描述词状态已改变的个数,如果返回0代表在描述词状态改变前已超过timeout时间,当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。
EBADF 文件描述词为无效的或该文件已关闭
EINTR 此调用被信号所中断
EINVAL 参数n 为负值。
ENOMEM 核心内存不足

范例 常见的程序片段:fs_set readset;
FD_ZERO(&readset);
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset){……}


下面是linux环境下select的一个简单用法

#include
#include
#include
#include
#include
#include

int main ()
{
int keyboard;
int ret,i;
char c;
fd_set readfd;
struct timeval timeout;
keyboard = open("/dev/tty",O_RDONLY | O_NONBLOCK);
assert(keyboard>0);
while(1)
{
timeout.tv_sec=1;
timeout.tv_usec=0;
FD_ZERO(&readfd);
FD_SET(keyboard,&readfd);
ret=select(keyboard+1,&readfd,NULL,NULL,&timeout);
if(FD_ISSET(keyboard,&readfd))
{
i=read(keyboard,&c,1);
if('\n'==c)
continue;
printf("hehethe input is %c\n",c);

if ('q'==c)
break;
}
}
}
用来循环读取键盘输入
from flask import Flask,render_template, request, jsonify import pymysql from py2neo import Node,Relationship,Graph,NodeMatcher,RelationshipMatcher import json,re import torch import torch.nn as nn import numpy as np import pickle import pandas as pd from utils.mysqlhelper import MySqLHelper from chatbot_graph import ChatBotGraph import export_poem import io import sys from http import HTTPStatus import dashscope # sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') app = Flask(__name__) def call_with_stream(word): messages = [ {'role': 'user', 'content': word}] responses = dashscope.Generation.call("qwen-plus", # 调用的模型接口 messages=messages, result_format='message', # set the result to be "message" format. stream=False, # 是否开启流式输出,不开启设置False incremental_output=False # 是否开启流式输出,不开启设置False ) print(responses['output']['choices'][0]['message']['content']) return responses['output']['choices'][0]['message']['content'] # for response in responses: # if response.status_code == HTTPStatus.OK: # print(response.output.choices[0]['message']['content'], end='') # return response.output.choices[0]['message']['content'] # else: # print('Request id: %s, Status code: %s, error code: %s, error message: %s' % ( # response.request_id, response.status_code, # response.code, response.message # )) #graph = Graph('http://localhost:7474',username='neo4j',password='123456') graph = Graph('http://localhost:7474/',auth=('neo4j','123456')) chatbot = ChatBotGraph() @app.route('/') def hello_world(): return render_template('show_data.html') @app.route('/index') def index(): return render_template('index.html') @app.route('/welcome') def welcome(): return render_template('welcome.html') @app.route('/author/<name>',methods=['GET','POST']) def author(name): return render_template('author.html',name=name) @app.route('/tz_create_poem') def tz_create_poem(): return render_template('create_poem.html') @app.route('/tz_chat_poem') def tz_chat_poem(): return render_template('chat_poem.html') @app.route('/tz_look_poem_desty/<name>',methods=['GET','POST']) def tz_look_poem_desty(name): return render_template('look_poem_desty.html',name=name) @app.route('/tz_look_all_poem_desty') def tz_look_all_poem_desty(): return render_template('look_all_poem_desty.html') @app.route('/tz_look_poemer_desty/<name>',methods=['GET','POST']) def tz_look_poemer_desty(name): return render_template('look_poemer_desty.html', name=name) @app.route('/tz_poem_appearance/<name>',methods=['GET','POST']) def tz_poem_appearance(name): return render_template('poem_appearance.html',poem_name=name) @app.route('/tz_find_poem/<name>',methods=['GET','POST']) def tz_find_poem(name): return render_template('find_poem.html',poem_name=name) @app.route('/tz_find_PoemByDestyAndName/<name>',methods=['GET','POST']) def tz_find_PoemByDestyAndName(name): return render_template('find_PoemByDestyAndName.html',ans=name) @app.route('/tz_find_poemerByDestyAndName/<name>',methods=['GET','POST']) def tz_find_poemerByDestyAndName(name): return render_template('find_poemerByDestyAndName.html',ans=name) #写各朝代的诗词总数 @app.route('/desty_sum',methods=['GET','POST']) def sum_desty(): data = {} data['唐代']=48330 data['宋代']=200000 data['元代']=39240 data['明代']=100000 data['清代']=92552 newdata=jsonify(data) print(jsonify(data)) return newdata #写各朝代的诗词总数 @app.route('/poemer_sum',methods=['GET','POST']) def sum_poemer(): data = {} data['唐代'] = 2470 data['宋代'] = 7598 data['元代'] = 671 data['明代'] = 2760 data['清代'] = 5741 newdata=jsonify(data) print(jsonify(data)) return newdata #首页各朝代诗人简单浏览 @app.route('/poemer_produce',methods=['GET','POST']) def poemer_produce(): desty = request.form.get("desty") if desty=="0": desty="'唐代'" elif desty=="1": desty="'宋代'" elif desty=="2": desty="'元代'" elif desty=="3": desty="'明代'" elif desty=="4": desty="'清代'" data = graph.run( 'match data=(p:desty{name:'+desty+'})-[r:`包含`]->(a:author) return a.name,a.src,a.produce LIMIT 10000 ').data() data_list = [] i = 0 for it in data: name = it.get('a.name') #src = it.get('a.src') produce = it.get('a.produce') #if i < 8 and src != 'http://www.huihua8.com/uploads/allimg/20190802kkk01/1531722472-EPucovIBNQ.jpg': if i < 8 : #print(name + " " + src + " " + produce) result = {} result['name'] = name #result['src'] = src sql = "select count(*) from author where author='%s'" connect = None connect = pymysql.connect(host="localhost", port=3306, user="root", password="123456", database="pome") cur = connect.cursor() print(sql % name) cur.execute(sql % name) exist_count = cur.fetchmany(1) if exist_count[0][0] > 0: sql = "select src from author where author='%s'" cur = connect.cursor() print(sql % name) cur.execute(sql % name) src_data = cur.fetchmany(1) print(src_data) #src = src_data[0][0] result['src']= src_data[0][0] else: #src='https://img0.baidu.com/it/u=4085259550,1835585026&fm=253&fmt=auto&app=138&f=PNG?w=654&h=500' result['src']='https://img0.baidu.com/it/u=4085259550,1835585026&fm=253&fmt=auto&app=138&f=PNG?w=654&h=500' #result['src'] = src #print('最终图片',src) print('最终图片',result['src']) #print('最终图片',src) result['produce'] = produce data_list.append(result) i = i + 1 elif i == 8: break print(data_list) return json.dumps(data_list) #作诗函数 def check7(ans): ans = re.split('[,。]', ans) if len(ans)!=5: return False for i in range(4): if len(ans[i])!=7: return False return True def check5(ans): ans = re.split('[,。]', ans) print(ans) if len(ans)!=5: return False for i in range(4): if len(ans[i])!=5: return False return True #创作诗词 @app.route('/create_poem',methods=['GET','POST']) def create_poem(): search_name = request.form.get("search_name") se_list=search_name.split(' ') f=False for it in se_list: if it=='7': f=True if f: if len(se_list[0])==4: ans=export_poem.qi_cang_poem(se_list[0]) while check7(ans)==False: ans = export_poem.qi_cang_poem(se_list[0]) else: ans=export_poem.qi_gen_poem(se_list[0]) while check7(ans) == False: ans = export_poem.qi_gen_poem(se_list[0]) else: if len(se_list[0])==4: ans=export_poem.wu_cang_poem(se_list[0]) while check5(ans) == False: ans=export_poem.wu_cang_poem(se_list[0]) else: ans=export_poem.wu_gen_poem(se_list[0]) while check5(ans) == False: ans=export_poem.wu_gen_poem(se_list[0]) ans_list=re.split('[,。]', ans) print(ans_list) return json.dumps(ans_list) #创作诗词 @app.route('/look_poem_desty',methods=['GET','POST']) def look_poem_desty(): desty=request.form.get("desty") page =request.form.get("page") # desty="唐代" db = MySqLHelper() sql='' sql2='' sql3='' sum='' f=False if desty=="唐代": sql = "select * from tang limit "+str(page)+",16;" sum=48330 elif desty=="宋代": sql = "select * from song limit "+str(page)+",16;" sum=200000 elif desty=="元代": sql = "select * from yuan limit "+str(page)+",16;" sum=39240 elif desty=="明代": sql = "select * from ming limit "+str(page)+",16;" sum=100000 elif desty=="清代": sql = "select * from qing limit "+str(page)+",16;" sum=92552 elif desty=="五言绝句": sql="select * from tang where formal='"+str("五言绝句")+"' limit "+str(page)+",16;" sql2="select count(*) from tang where formal='"+str("五言绝句")+"';" ret=db.selectone(sql2) sum=ret[0] elif desty=="七言绝句": sql="select * from tang where formal='"+str("七言绝句")+"' limit "+str(page)+",16;" sql2="select count(*) from tang where formal='"+str("七言绝句")+"';" ret=db.selectone(sql2) sum=ret[0] elif desty=="五言律诗": sql="select * from tang where formal='"+str("五言律诗")+"' limit "+str(page)+",16;" sql2="select count(*) from tang where formal='"+str("五言律诗")+"';" ret=db.selectone(sql2) sum=ret[0] elif desty=="七言律诗": sql="select * from tang where formal='"+str("七言律诗")+"' limit "+str(page)+",16;" sql2="select count(*) from tang where formal='"+str("七言律诗")+"';" ret=db.selectone(sql2) sum=ret[0] elif desty=="词": sql="select * from song where ci_name!='"+str("无")+"' limit "+str(page)+",16;" sql2="select count(*) from song where ci_name!='"+str("无")+"';" ret=db.selectone(sql2) sum=ret[0] elif desty=="曲": sql="select * from yuan where qu_name!='"+str("无")+"' limit "+str(page)+",16;" sql2="select count(*) from yuan where qu_name!='"+str("无")+"';" ret=db.selectone(sql2) sum=ret[0] else: f=True author=desty sql2="select desty from author where author=%s" ret= db.selectone(sql=sql2,param=author) desty=ret[0] if desty == "唐代": sql = "select * from tang where author ='"+str(author)+"' limit " + str(page) + ",16;" sql3 = "select count(*) from tang where author ='" + str(author) + "';" elif desty == "宋代": sql = "select * from song where author ='"+str(author)+"' limit " + str(page) + ",16;" sql3 = "select count(*) from song where author ='" + str(author) + "';" elif desty == "元代": sql = "select * from yuan where author ='"+str(author)+"' limit " + str(page) + ",16;" sql3 = "select count(*) from yuan where author ='" + str(author) + "';" elif desty == "明代": sql = "select * from ming where author ='"+str(author)+"' limit " + str(page) + ",16;" sql3 = "select count(*) from ming where author ='" + str(author) + "';" elif desty == "清代": sql = "select * from qing where author ='"+str(author)+"' limit " + str(page) + ",16;" sql3 = "select count(*) from qing where author ='" + str(author) + "';" ret = db.selectone(sql=sql3) sum=ret[0] jsonData = [] ret, count = db.selectall(sql=sql) for row in ret: result = {} result['title'] = row[0] result['desty']=row[1] result['author'] = row[2] content_list=str(row[3]).replace('\n','').split('。') result['tag']=row[7] if desty=='词': result['formal']='词' elif desty=='曲': result['formal']='曲' else: result['formal']=row[8] #格式化诗句内容 ans_content_list = [] if (result['formal'] == '七言' or result['formal'] == '七言绝句' or result['formal'] == '七言律诗'): for it in content_list: if it != '': ju_list = it.split(',') if len(ju_list) != 2: continue ans_content_list.append(ju_list[0] + ",") ans_content_list.append(ju_list[1] + "。") result['content'] = ans_content_list else: for it in content_list: if it != '': it = it + "。" ans_content_list.append(it) result['content'] = ans_content_list result['sum']=sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/look_all_poem_desty',methods=['GET','POST']) def look_all_poem_desty(): page = request.form.get("page") # desty="唐代" db = MySqLHelper() # sql = 'select count(*) from author' # ret=db.selectone(sql) sum=20088 sql2="select * from author limit " + str(page) + ",100;" jsonData = [] ret, count = db.selectall(sql=sql2) for row in ret: result = {} result['author'] = row[0] result['desty'] = row[5] result['num'] = row[2] result['sum'] = sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) #模糊查询诗人,分页展示 @app.route('/look_poemerByDestyAndName',methods=['POST','GET']) def look_poemerByDestyAndName(): page = request.form.get("page") desty = request.form.get("desty") poemer_name=request.form.get("poemer_name") print(desty+" "+poemer_name) db = MySqLHelper() sql = "select * from author where desty='" + str(desty) + "' and author like '%"+poemer_name+"%' limit " + str(page) + ",20;" sql2 = "select count(*) from author where desty='" + str(desty) + "' and author like '%"+poemer_name+"%'"; ret=db.selectone(sql2) sum=ret[0] print("诗人个数:"+str(sum)) jsonData = [] ret, count = db.selectall(sql=sql) for row in ret: result = {} result['author'] = row[0] result['produce'] = row[1] result['src'] = row[4] result['sum'] = sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/look_poemer_desty',methods=['GET','POST']) def look_poemer_desty(): page = request.form.get("page") desty=request.form.get("desty") db = MySqLHelper() sql = '' sql2 = '' sum = '' f = False sql = "select * from author where desty='"+str(desty)+"' limit " + str(page) + ",20;" sql2="select count(*) from author where desty='"+str(desty)+"';" ret=db.selectone(sql2) sum=ret[0] jsonData = [] ret, count = db.selectall(sql=sql) for row in ret: result = {} result['author'] = row[0] result['produce'] = row[1] result['src'] = row[4] result['sum'] = sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) def read_where(): data=pd.read_excel('static/data/gu_jin_lng_lat.xlsx') gu_name=list(data.get('gu_name')) return gu_name def travel_poem(name): gu_name=read_where() data = graph.run( 'match data=(p:author{name:'+"'"+name+"'"+'})-[r:`事迹`]->(a:things) return a.where_name,a.date,a.name').data() ans=[] for it in data: where_name = it.get('a.where_name') date = it.get('a.date') things_name = it.get('a.name') where_list=str(where_name).split(',') for it in where_list: if it in gu_name: ans.append(it) print(date+" "+things_name+" "+it) ans=list(set(ans)) if len(ans)!=0: ans=",".join(ans) return ans else: return "无" def common_name(name): data = graph.run( 'match data=(p:author{name:'+"'"+name+"'"+'})-[r:`合称`]->(a:common_name) return a.name').data() ans = [] for it in data: name = it.get('a.name') ans.append(name) if len(ans)!=0: ans=",".join(ans) return ans else: return "无" def zuopin(name): data = graph.run( 'match data=(p:author{name:' + "'" + name + "'" + '})-[r:`写作`]->(a:poem) return a.name limit 30').data() ans = [] for it in data: name = it.get('a.name') ans.append(name) ans = ",".join(ans) print(ans) return ans @app.route('/get_author_message',methods=['GET','POST']) def get_author_message(): author_name = request.form.get("author_name") if author_name=="": return False db=MySqLHelper() sql='select * from author where author=%s' ret=db.selectone(sql=sql,param=author_name) jsonData = [] result={} result['author']=ret[0] result['desty']=ret[5] result['produce']=ret[1] result['experience']=ret[3] result['zi']=ret[8] result['hao']=ret[9] result['begin_time']=ret[6] result['end_time']=ret[7] result['travel_name']=travel_poem(author_name) result['common_name']=common_name(author_name) result['zuopin']=zuopin(author_name) jsonData.append(result) return json.dumps(jsonData) @app.route('/get_famous_sentenous',methods=['GET','POST']) def get_famous_sentenous(): author_name = request.form.get("author_name") page = request.form.get("page") db=MySqLHelper() jsonData = [] sql="select count(*) from famous_sentous where author = '"+str(author_name)+"' " res=db.selectone(sql) sum=res[0] print(sum) sql8="select * from famous_sentous where author = '"+str(author_name)+"' limit " + str(page) + ",10;" ret, count = db.selectall(sql=sql8) for row in ret: result = {} result['sent'] = row[0] result['author'] = row[1] result['poem_name'] = row[2] result['sum']=sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/poemer_things',methods=['GET','POST']) def poemer_things(): name=request.form.get("author_name") data = graph.run( 'match data=(p:author{name:' + "'" + name + "'" + '})-[r:`事迹`]->(a:things) return a.name,a.date,p.bg_time,p.ed_time,p.produce').data() db = MySqLHelper() sql='select * from author where author=%s' ret=db.selectone(sql=sql,param=name) jsonData = [] result={} #produce=ret[1] begin_time=ret[6] end_time=ret[7] # bg = int(str(data[0].get('p.bg_time')).replace('年', '')) # ed = int(str(data[0].get('p.ed_time')).replace('年', '')) # produce=str(data[0].get('p.produce')).split('。')[0]+"。" bg = int(begin_time.replace('年', '')) ed = int(end_time.replace('年', '')) #produce=str(data[0].get('p.produce')).split('。')[0]+"。" if data[0].get('p.produce') ==None : produce='无' else: produce=str(data[0].get('p.produce')).split('。')[0]+"。" dit = {} for i in range(len(data)): name = str(data[len(data) - i - 1].get('a.name')) date = int(re.findall(r'\d+',str(data[len(data) - i - 1].get('a.date')))[0]) if date >= bg and date <= ed: if date not in dit.keys(): dit[date] = name else: dit[date] = dit[date] + "<br>" + name jsonDate=[] jsonDate.append({'time':str(bg)+"年~"+str(ed)+"年",'things':produce}) new_dit=sorted(dit) for it in new_dit: dict={} dict['time']=str(it)+"年" dict['things']=dit[it] jsonDate.append(dict) print(jsonDate) #db.close() return json.dumps(jsonDate) @app.route('/get_common_name_relation',methods=['GET','POST']) def get_common_name_relation(): author_name=request.form.get("author_name") data = graph.run( 'match data=(p:author{name:' + "'" + author_name + "'" + '})-[r:`合称`]->(a:common_name) return a.name,p.src').data() common_list = [] author_img_src = str(data[0].get('p.src')) other_src = "/static/images/color_back.jpeg" ans_map = {} ans = {} nodes = [] edges = [] i = 0 ans_map[author_name] = i i = i + 1 for it in data: name = it.get('a.name') ans_map[name] = i common_list.append(name) i = i + 1 # 加入作者节点 dit = {} dit["name"] = author_name dit["image"] = author_img_src nodes.append(dit) for it in common_list: dic = {} dic["name"] = it dic["image"] = other_src nodes.append(dic) # 加入其他合称的作者节点与关系 for it in common_list: data = graph.run( 'match data=(p:common_name{name:' + "'" + it + "'" + '})-[r:`包含`]->(a:author) return a.name,a.src').data() for k in data: qi_name = str(k.get('a.name')) qi_src = str(k.get('a.src')) if qi_name not in ans_map.keys(): dic = {} dic["name"] = qi_name dic["image"] = qi_src nodes.append(dic) ans_map[qi_name] = i i = i + 1 dic = {} dic["source"] = ans_map[qi_name] dic["target"] = ans_map[it] dic["relation"] = "合称" edges.append(dic) ans["nodes"] = nodes ans["edges"] = edges print(json.dumps(ans)) return json.dumps(ans) @app.route('/get_friend_relation',methods=['GET','POST']) def get_friend_relation(): author_name=request.form.get("author_name") data = graph.run( 'match data=(p:author{name:' + "'" + author_name + "'" + '})-[r:`好友`]->(a:author) return p.bg_time,p.ed_time,p.src,a.name,a.src,a.bg_time,a.ed_time').data() if len(data)>0: bg_time=int(str(data[0].get('p.bg_time')).replace('年','')) ed_time=int(str(data[0].get('p.ed_time')).replace('年','')) friend_map={} friend_src={} ans = {} nodes = [] edges = [] i=0 author_img_src=str(data[0].get('p.src')) friend_map[author_name]=i friend_src[author_name]=author_img_src #添加作者节点 dit = {} dit["name"] = author_name dit["image"] = author_img_src nodes.append(dit) i=i+1 friend_list=[] bg_time_list=[] ed_time_list=[] for it in data: name=str(it.get('a.name')) img_src=str(it.get('a.src')) a_bg_time=str(it.get('a.bg_time')) a_ed_time=str(it.get('a.ed_time')) if a_bg_time=='无' or a_ed_time=='无' or img_src=="http://www.huihua8.com/uploads/allimg/20190802kkk01/1531722472-EPucovIBNQ.jpg": continue a_bg_time=int(a_bg_time.replace('年','')) a_ed_time =int(a_ed_time.replace('年','')) if a_ed_time<bg_time or a_bg_time>ed_time: continue friend_map[name]=i friend_src[name]=img_src # 构建第一层作者关系网络 dic = {} dic["name"] = name dic["image"] = friend_src[name] nodes.append(dic) edg_dic = {} edg_dic["source"] = 0 edg_dic["target"] = friend_map[name] edg_dic["relation"] = "好友" edges.append(edg_dic) friend_list.append(name) bg_time_list.append(a_bg_time) ed_time_list.append(a_ed_time) i=i+1 #构建第二层还有关系网 for j in range(len(friend_list)): bg_time=bg_time_list[j] ed_time=ed_time_list[j] data = graph.run( 'match data=(p:author{name:' + "'" + friend_list[j] + "'" + '})-[r:`好友`]->(a:author) return p.bg_time,p.ed_time,p.src,a.name,a.src,a.bg_time,a.ed_time ').data() for kk in data: name=str(kk.get('a.name')) img_src=str(kk.get('a.src')) a_bg_time = str(kk.get('a.bg_time')) a_ed_time = str(kk.get('a.ed_time')) if a_bg_time == '无' or a_ed_time == '无' or img_src=="http://www.huihua8.com/uploads/allimg/20190802kkk01/1531722472-EPucovIBNQ.jpg": continue a_bg_time = int(a_bg_time.replace('年', '')) a_ed_time = int(a_ed_time.replace('年', '')) if a_ed_time < bg_time or a_bg_time > ed_time: continue if name not in friend_map.keys(): friend_map[name]=i i=i+1 friend_src[name]=img_src #添加新节点 dic = {} dic["name"] = name dic["image"] = img_src nodes.append(dic) #添加对应的链接线 edg_dic = {} edg_dic["source"] = friend_map[friend_list[j]] edg_dic["target"] = friend_map[name] edg_dic["relation"] = "好友" edges.append(edg_dic) ans["nodes"]=nodes ans["edges"]=edges print(json.dumps(ans)) return json.dumps(ans) else: ans={} ans["nodes"]='无' return json.dumps(ans) #前台展示:三位诗人旅行地图 @app.route('/get_where_relation_show_threePoemer',methods=['GET','POST']) def get_where_relation_show_threePoemer(): author_list=['李白','杜甫','白居易'] nums=['one','two','three'] ans={} address_data = pd.read_excel('static/data/gu_jin_lng_lat.xlsx') gu_name = list(address_data.get('gu_name')) kk=0 for author_name in author_list: data = graph.run( 'match data=(p:author{name:' + "'" + author_name + "'" + '})-[r:`事迹`]->(a:things) return a.date,a.name,a.where_name').data() date_list = [] things_list = [] where_list = [] for it in data: date = str(it.get('a.date')) things = str(it.get('a.name')) where_name = str(it.get('a.where_name')) if things != '无': date_list.append(str(date)) things_list.append(things) where_list.append(where_name) ans_list = [] ans_dic = {} for i in range(len(date_list)): i = len(date_list) - i - 1 date = date_list[i] things = things_list[i] where_name = where_list[i].split(',') for k in where_name: if k in gu_name and k not in ans_dic: dit = {} dit['name'] = k dit['things'] = date + "," + things ans_dic[k] = date + "," + things ans_list.append(dit) break new_ans_list = [] head = ans_list[0]['name'] small = [] small.append({"name": head}) small.append({"name": head, "value": 100, "things": ans_dic[head]}) new_ans_list.append(small) for i in range(1, len(ans_list)): next = ans_list[i]['name'] small = [] small.append({"name": head}) small.append({"name": next, "value": 50, "things": ans_dic[next]}) new_ans_list.append(small) ans[nums[kk]]=new_ans_list kk=kk+1 ans["name"]=author_list print(ans) return jsonify(ans) @app.route('/get_where_relation',methods=['GET','POST']) def get_where_relation(): author_name = request.form.get("author_name") address_data=pd.read_excel('static/data/gu_jin_lng_lat.xlsx') gu_name=list(address_data.get('gu_name')) data = graph.run( 'match data=(p:author{name:' + "'" + author_name + "'" + '})-[r:`事迹`]->(a:things) return a.date,a.name,a.where_name').data() date_list=[] things_list=[] where_list=[] for it in data: date=str(it.get('a.date')) things=str(it.get('a.name')) where_name=str(it.get('a.where_name')) if things!='无': date_list.append(str(date)) things_list.append(things) where_list.append(where_name) ans_list=[] ans_dic={} for i in range(len(date_list)): i=len(date_list)-i-1 date=date_list[i] things=things_list[i] where_name=where_list[i].split(',') for k in where_name: if k in gu_name and k not in ans_dic: dit={} dit['name']=k dit['things']=date+","+things ans_dic[k]=date+","+things ans_list.append(dit) break new_ans_list=[] head=ans_list[0]['name'] small = [] small.append({"name": head}) small.append({"name":head,"value":100,"things":ans_dic[head]}) new_ans_list.append(small) # nsmall = [] # nsmall.append({"name": head}) # nsmall.append({"name": ans_list[1]['name'], "value": 100, "things": ans_dic[ans_list[1]['name']]}) # new_ans_list.append(nsmall) # for i in range(1,len(ans_list)): # next=ans_list[i]['name'] # small=[] # small.append({"name":head}) # small.append({"name":next,"value":100,"things":ans_dic[next]}) # new_ans_list.append(small) for i in range(0,len(ans_list)): if i==0: head=ans_list[i]['name'] continue next=ans_list[i]['name'] small = [] small.append({"name": head}) small.append({"name": next, "value": 100, "things": ans_dic[next]}) new_ans_list.append(small) head=next ans_xlf={} ans_xlf["one"]=new_ans_list print(json.dumps(ans_xlf)) return json.dumps(ans_xlf) #诗词模糊搜索 @app.route('/get_poem_by_nameAndDesty',methods=['GET','POST']) def get_poem_by_nameAndDesty(): poem_name = request.form.get("poem_name") desty_name = request.form.get("desty_name") page=request.form.get("page") db = MySqLHelper() jsonData = [] sql='' sql2='' if desty_name=='唐代': sql="select * from tang where title like '%" + poem_name + "%';" sql2="select * from tang where title like '%"+poem_name+"%' limit " + str(page) + ",16;" elif desty_name=='宋代': sql="select * from song where title like '%" + poem_name + "%';" sql2 = "select * from song where title like '%" + poem_name + "%' limit " + str(page) + ",16;" elif desty_name=='元代': sql="select * from yuan where title like '%" + poem_name + "%';" sql2 = "select * from yuan where title like '%" + poem_name + "%' limit " + str(page) + ",16;" elif desty_name=='明代': sql="select * from ming where title like '%" + poem_name + "%';" sql2 = "select * from ming where title like '%" + poem_name + "%' limit " + str(page) + ",16;" elif desty_name=='清代': sql="select * from qing where title like '%" + poem_name + "%';" sql2 = "select * from qing where title like '%" + poem_name + "%' limit " + str(page) + ",16;" elif desty_name=='五言绝句' or desty_name=='七言绝句' or desty_name=='五言律诗' or desty_name=='七言律诗': sql = "select * from song where title like '%" + poem_name + "%' and formal='"+desty_name+"';" sql2 = "select * from song where title like '%" + poem_name + "%' and formal='"+desty_name+"' limit " + str(page) + ",16;" elif desty_name=='曲': sql = "select * from yuan where title like '%" + poem_name + "%' and qu_name!='无';" sql2 = "select * from yuan where title like '%" + poem_name + "%' and qu_name!='无' limit " + str(page) + ",16;" elif desty_name=='词': sql = "select * from song where title like '%" + poem_name + "%' and ci_name!='无';" sql2 = "select * from song where title like '%" + poem_name + "%' and ci_name!='无' limit " + str(page) + ",16;" else: sql3="select * from author where author='"+desty_name+"'" ans=db.selectone(sql=sql3) author=str(ans[0]) desty_name=str(ans[5]) if desty_name == '唐代': sql = "select * from tang where title like '%" + poem_name + "%' and author='"+author+"';" sql2 = "select * from tang where title like '%" + poem_name + "%' and author='"+author+"' limit " + str(page) + ",16;" elif desty_name == '宋代': sql = "select * from song where title like '%" + poem_name + "%' and author='"+author+"';" sql2 = "select * from song where title like '%" + poem_name + "%' and author='"+author+"' limit " + str(page) + ",16;" elif desty_name == '元代': sql = "select * from yuan where title like '%" + poem_name + "%' and author='"+author+"';" sql2 = "select * from yuan where title like '%" + poem_name + "%' and author='"+author+"' limit " + str(page) + ",16;" elif desty_name == '明代': sql = "select * from ming where title like '%" + poem_name + "%' and author='"+author+"';" sql2 = "select * from ming where title like '%" + poem_name + "%' and author='"+author+"' limit " + str(page) + ",16;" elif desty_name == '清代': sql = "select * from qing where title like '%" + poem_name + "%' and author='"+author+"';" sql2 = "select * from qing where title like '%" + poem_name + "%' and author='"+author+"' limit " + str(page) + ",16;" ret2, count = db.selectall(sql=sql) sum=count ret,counts=db.selectall(sql=sql2) for row in ret: result = {} result['title'] = row[0] result['desty'] = row[1] result['author'] = row[2] content_list = str(row[3]).replace('\n', '').split('。') result['trans_content'] = str(row[4]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['appear'] = str(row[5]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['background'] = str(row[6]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['tag'] = row[7] if row[8] != '无': result['formal'] = row[8] elif row[10] != '无': result['formal'] = '词' elif row[11] != '无': result['formal'] = '曲' else: result['formal'] = '无' ans_content_list = [] if (result['formal'] == '七言' or result['formal'] == '七言绝句' or result['formal'] == '七言律诗'): for it in content_list: if it != '': ju_list = it.split(',') if len(ju_list) != 2: continue ans_content_list.append(ju_list[0] + ",") ans_content_list.append(ju_list[1] + "。") result['content'] = ans_content_list else: for it in content_list: if it != '': it = it + "。" ans_content_list.append(it) result['content'] = ans_content_list result['sum']=sum jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/get_poem_by_name',methods=['GET','POST']) def get_poem_by_name(): poem_name = request.form.get("poem_name") db = MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] jsonData = [] for it in desty: sql = "select * from " + it + " where title like '%" + poem_name + "%';" ret, count = db.selectall(sql=sql) for row in ret: result = {} result['title'] = row[0] result['desty'] = row[1] result['author'] = row[2] content_list = str(row[3]).replace('\n', '').split('。') result['trans_content'] = str(row[4]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['appear'] = str(row[5]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['background'] = str(row[6]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['tag'] = row[7] if row[8] != '无': result['formal'] = row[8] elif row[10] != '无': result['formal'] = '词' elif row[11] != '无': result['formal'] = '曲' else: result['formal'] = '无' ans_content_list = [] if (result['formal'] == '七言' or result['formal'] == '七言绝句' or result['formal'] == '七言律诗'): for it in content_list: if it != '': ju_list = it.split(',') if len(ju_list)!=2: continue ans_content_list.append(ju_list[0] + ",") ans_content_list.append(ju_list[1] + "。") result['content'] = ans_content_list else: for it in content_list: if it != '': it = it + "。" ans_content_list.append(it) result['content'] = ans_content_list jsonData.append(result) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/get_poem_message',methods=['GET','POST']) def get_poem_message(): poem_name=request.form.get("poem_name") db=MySqLHelper() desty=['tang','song','yuan','ming','qing'] jsonData=[] for it in desty: sql = "select * from " + it + " where title = '" + poem_name + "';" row= db.selectone(sql=sql) # for row in ret: if row!=None: result = {} result['title'] = row[0] result['desty'] = row[1] result['author'] = row[2] content_list = str(row[3]).replace('\n', '').split('。') result['trans_content'] = str(row[4]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['appear'] = str(row[5]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['background'] = str(row[6]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') result['tag'] = row[7] if row[8] != '无': result['formal'] = row[8] elif row[10] != '无': result['formal'] = '词' elif row[11] != '无': result['formal'] = '曲' else: result['formal'] = '无' ans_content_list = [] if (result['formal'] == '七言' or result['formal'] == '七言绝句' or result['formal'] == '七言律诗'): for it in content_list: if it!='': ju_list = it.split(',') if len(ju_list)!=2: continue ans_content_list.append(ju_list[0] + ",") ans_content_list.append(ju_list[1]+"。") result['content'] = ans_content_list else: for it in content_list: if it!='': it=it+"。" ans_content_list.append(it) result['content'] = ans_content_list jsonData.append(result) break print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/get_poem_author_message',methods=['GET','POST']) def get_poem_author_message(): poem_name = request.form.get("poem_name") db = MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] author='' jsonData=[] for it in desty: sql = "select * from " + it + " where title = '" + poem_name + "';" ret = db.selectone(sql=sql) if ret!=None: author=ret[2] break sql2="select * from author where author='"+author+"';" ret=db.selectone(sql=sql2) dic={} dic['author']=ret[0] dic['produce']=ret[1] dic['experience']=ret[3] jsonData.append(dic) print(json.dumps(jsonData)) return json.dumps(jsonData) @app.route('/get_poem_zhu',methods=['GET','POST']) def get_poem_zhu(): poem_name = request.form.get("poem_name") db = MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] zhu='' jsonData=[] for it in desty: sql = "select * from " + it + " where title = '" + poem_name + "';" ret = db.selectone(sql=sql) if ret!=None: zhu=ret[12] break dic={} dic['zhu']=zhu jsonData.append(dic) print(json.dumps(jsonData)) return json.dumps(jsonData) #获取诗词的相关时空背景:诗词 @app.route('/get_poemtime_about_poem',methods=['GET','POST']) def get_poemtime_about_poem(): poem_name = request.form.get("poem_name") db=MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] author='' bg_time='' for it in desty: sql = "select * from " + it + " where title like '%" + poem_name + "%' or qu_name like '%"+poem_name+"%' or zhu like '%"+poem_name+"%' limit 1" ret = db.selectone(sql=sql) if ret!=None: author=ret[2] bg_time=str(ret[9]).replace('年','') break print(author) print(bg_time) date_list=[] back_list=[] poem_list=[] content_list=[] flag=False left=right=0 if bg_time!='无': flag=True left=int(bg_time)-3 right=int(bg_time)+3 for it in desty: sql = "select * from " + it + " where author = '" + author + "';" #sql = "select * from " + it + " where title like '%" + poem_name + "%' or qu_name like '%" + poem_name + "%' or zhu like '%" + poem_name + "%' limit 1" ret,count = db.selectall(sql=sql) if ret!=None: for row in ret: if str(row[9])!='无' and str(row[9]).find('.')==-1 and str(row[9]).find('—')==-1 and str(row[6])!='无': time=int(str(row[9]).replace('年','')) if flag: if time>=left and time<=right and bool(re.search(r'\d', row[6])): date_list.append(time) back_list.append(row[6]) poem_list.append(row[0]) content_list.append(row[3]) else: date_list.append(time) back_list.append(row[6]) poem_list.append(row[0]) content_list.append(row[3]) jsonData=[] for dd in range(left,right+1): for i in range(len(date_list)): time=date_list[i] poem=poem_list[i] back=back_list[i] content=content_list[i].replace('\n','').split('。') ans_content=[] for it in content: if it!='': ans_content.append(it+"。") if time==dd: dic={} dic['time']=str(time)+"年" dic['title']=poem dic['back']=back dic['content']=ans_content jsonData.append(dic) #print(json.dumps(jsonData).encode('utf-8').decode("unicode-escape")) return json.dumps(jsonData) #诗词情感分析 from poem_emotion_predict import poem_emotion_predict @app.route('/get_emotion_by_poem_name',methods=['GET','POST']) def get_emotion_by_poem_name(): poem_name = request.form.get("poem_name") db = MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] content='' for it in desty: sql = "select * from " + it + " where title = '" + poem_name + "';" ret = db.selectone(sql=sql) if ret != None: content=str(ret[3]).replace('\n','') trans_content = str(ret[4]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') appear = str(ret[5]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') break jsonData=poem_emotion_predict(content) jsonData[0]['appear'] = appear jsonData[0]['trans_content'] = trans_content return json.dumps(jsonData) #诗句情感分析 from poem_emotion_predict import poem_emotion_predict @app.route('/get_emotion_by_ju',methods=['GET','POST']) def get_emotion_by_ju(): poem_name = request.form.get("poem_name") ju_name=request.form.get("ju_name") # index=int(request.form.get("index")) db = MySqLHelper() desty = ['tang', 'song', 'yuan', 'ming', 'qing'] content='' appear='' trans_content='' for it in desty: sql = "select * from " + it + " where title = '" + poem_name + "';" ret = db.selectone(sql=sql) if ret != None: content=str(ret[3]).split('\n') trans_content=str(ret[4]) #trans_content = str(ret[4]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') appear = str(ret[5]).replace('\n', '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') break index=0 for i in range(len(content)): if content[i].find(ju_name)!=-1: index=i ans_trans='无' if trans_content!='无': trans_content=trans_content.split('。') ans_trans=trans_content[index].replace('\n','')+"。" jsonData=poem_emotion_predict(ju_name) jsonData[0]['appear']=appear jsonData[0]['trans_content']=ans_trans return json.dumps(jsonData) @app.route('/send_question',methods=['GET','POST']) def send_question(): que=request.form.get("que") print(que) que=str(que) print("我的问题:"+que) answer = call_with_stream('请详细回答:'+que) #answer = chatbot.chat_main(que) ans={} ans["answer"]=answer print(json.dumps(ans).encode('utf-8').decode("unicode-escape")) return json.dumps(ans) if __name__ == '__main__': app.run(debug=True) 介绍代码
最新发布
06-05
### el-select 组件处理 `&nbsp;` 问题解决方案 当使用 `el-select` 组件时,如果选项中的文本包含 HTML 实体如 `&nbsp;`,可能会遇到显示不正常的情况。为了确保这些实体能够正确解析并显示为空格或其他预期字符,可以采取以下几种方法: #### 方法一:自定义插槽 (Scoped Slot) 通过使用 scoped slot 可以更好地控制选项的内容渲染方式。这样可以直接操作 DOM 节点,从而避免默认行为对特殊字符的不当处理。 ```html <template> <div> <el-select v-model="selectedValue"> <el-option v-for="(item, index) in options" :key="index" :label="renderLabel(item)" :value="item.value"> </el-option> </el-select> </div> </template> <script> export default { data() { return { selectedValue: '', options: [ { value: 'option1', label: 'Option&nbsp;with space' }, { value: 'option2', label: 'Another option with &nbsp;' } ] }; }, methods: { renderLabel(item) { // 使用 innerHTML 来保留标签内的 html 特殊字符 const span = document.createElement('span'); span.innerHTML = item.label; return span.innerText || span.textContent; } } }; </script> ``` 这种方法利用 JavaScript 的 `innerHTML` 属性将字符串作为 HTML 进行解析,然后再获取纯文本形式返回给组件用于显示[^1]。 #### 方法二:CSS 解决方案 另一种更简单的方法是在样式层面解决问题。可以通过 CSS 设置 `.el-select-dropdown__item` 类下的元素强制其识别某些特定的空白符为实际的空间而不是忽略它们。 ```css .el-select-dropdown__item { white-space: pre-wrap !important; /* 或者其他合适的属性 */ } ``` 此设置允许换行和多个连续空格得以保存下来,并按照原样呈现给用户查看[^2]。 这两种方法都可以有效地解决 `el-select` 中由于 `&nbsp;` 导致的问题,具体选择哪种取决于项目需求和个人偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值