首页
关于
Search
1
Win10/win11 专业版 激活密钥(注册码)
873 阅读
2
欢迎使用 Typecho
720 阅读
3
SeuratData数据集-包含了各种常用的公共数据
362 阅读
4
如何恢复状态
254 阅读
5
读后感11-17
232 阅读
默认分类
想做的事
Python
读后感
日记
随笔
音乐盒
Kali
视频
番茄钟
登录
Search
连祈
累计撰写
83
篇文章
累计收到
13
条评论
首页
栏目
默认分类
想做的事
Python
读后感
日记
随笔
音乐盒
Kali
视频
番茄钟
页面
关于
搜索到
83
篇与
的结果
2022-12-06
blivedm 项目阅读 之 models.py
这个文件应该主要是数据结构# -*- coding: utf-8 -*- import json from typing import * __all__ = ( 'HeartbeatMessage', 'DanmakuMessage', 'GiftMessage', 'GuardBuyMessage', 'SuperChatMessage', 'SuperChatDeleteMessage', ) class HeartbeatMessage: """ 心跳消息 :param popularity: 人气值 """ def __init__( self, popularity: int = None, ): self.popularity: int = popularity @classmethod def from_command(cls, data: dict): return cls( popularity=data['popularity'], ) class DanmakuMessage: """ 弹幕消息 :param mode: 弹幕显示模式(滚动、顶部、底部) :param font_size: 字体尺寸 :param color: 颜色 :param timestamp: 时间戳(毫秒) :param rnd: 随机数,前端叫作弹幕ID,可能是去重用的 :param uid_crc32: 用户ID文本的CRC32 :param msg_type: 是否礼物弹幕(节奏风暴) :param bubble: 右侧评论栏气泡 :param dm_type: 弹幕类型,0文本,1表情,2语音 :param emoticon_options: 表情参数 :param voice_config: 语音参数 :param mode_info: 一些附加参数 :param msg: 弹幕内容 :param uid: 用户ID :param uname: 用户名 :param admin: 是否房管 :param vip: 是否月费老爷 :param svip: 是否年费老爷 :param urank: 用户身份,用来判断是否正式会员,猜测非正式会员为5000,正式会员为10000 :param mobile_verify: 是否绑定手机 :param uname_color: 用户名颜色 :param medal_level: 勋章等级 :param medal_name: 勋章名 :param runame: 勋章房间主播名 :param medal_room_id: 勋章房间ID :param mcolor: 勋章颜色 :param special_medal: 特殊勋章 :param user_level: 用户等级 :param ulevel_color: 用户等级颜色 :param ulevel_rank: 用户等级排名,>50000时为'>50000' :param old_title: 旧头衔 :param title: 头衔 :param privilege_type: 舰队类型,0非舰队,1总督,2提督,3舰长 """ def __init__( self, mode: int = None, font_size: int = None, color: int = None, timestamp: int = None, rnd: int = None, uid_crc32: str = None, msg_type: int = None, bubble: int = None, dm_type: int = None, emoticon_options: Union[dict, str] = None, voice_config: Union[dict, str] = None, mode_info: dict = None, msg: str = None, uid: int = None, uname: str = None, admin: int = None, vip: int = None, svip: int = None, urank: int = None, mobile_verify: int = None, uname_color: str = None, medal_level: str = None, medal_name: str = None, runame: str = None, medal_room_id: int = None, mcolor: int = None, special_medal: str = None, user_level: int = None, ulevel_color: int = None, ulevel_rank: str = None, old_title: str = None, title: str = None, privilege_type: int = None, ): self.mode: int = mode self.font_size: int = font_size self.color: int = color self.timestamp: int = timestamp self.rnd: int = rnd self.uid_crc32: str = uid_crc32 self.msg_type: int = msg_type self.bubble: int = bubble self.dm_type: int = dm_type self.emoticon_options: Union[dict, str] = emoticon_options self.voice_config: Union[dict, str] = voice_config self.mode_info: dict = mode_info self.msg: str = msg self.uid: int = uid self.uname: str = uname self.admin: int = admin self.vip: int = vip self.svip: int = svip self.urank: int = urank self.mobile_verify: int = mobile_verify self.uname_color: str = uname_color self.medal_level: str = medal_level self.medal_name: str = medal_name self.runame: str = runame self.medal_room_id: int = medal_room_id self.mcolor: int = mcolor self.special_medal: str = special_medal self.user_level: int = user_level self.ulevel_color: int = ulevel_color self.ulevel_rank: str = ulevel_rank self.old_title: str = old_title self.title: str = title self.privilege_type: int = privilege_type @classmethod def from_command(cls, info: dict): if len(info[3]) != 0: medal_level = info[3][0] medal_name = info[3][1] runame = info[3][2] room_id = info[3][3] mcolor = info[3][4] special_medal = info[3][5] else: medal_level = 0 medal_name = '' runame = '' room_id = 0 mcolor = 0 special_medal = 0 return cls( mode=info[0][1], font_size=info[0][2], color=info[0][3], timestamp=info[0][4], rnd=info[0][5], uid_crc32=info[0][7], msg_type=info[0][9], bubble=info[0][10], dm_type=info[0][12], emoticon_options=info[0][13], voice_config=info[0][14], mode_info=info[0][15], msg=info[1], uid=info[2][0], uname=info[2][1], admin=info[2][2], vip=info[2][3], svip=info[2][4], urank=info[2][5], mobile_verify=info[2][6], uname_color=info[2][7], medal_level=medal_level, medal_name=medal_name, runame=runame, medal_room_id=room_id, mcolor=mcolor, special_medal=special_medal, user_level=info[4][0], ulevel_color=info[4][2], ulevel_rank=info[4][3], old_title=info[5][0], title=info[5][1], privilege_type=info[7], ) @property def emoticon_options_dict(self) -> dict: """ 示例: {'bulge_display': 0, 'emoticon_unique': 'official_13', 'height': 60, 'in_player_area': 1, 'is_dynamic': 1, 'url': 'https://i0.hdslb.com/bfs/live/a98e35996545509188fe4d24bd1a56518ea5af48.png', 'width': 183} """ if isinstance(self.emoticon_options, dict): return self.emoticon_options try: return json.loads(self.emoticon_options) except (json.JSONDecodeError, TypeError): return {} @property def voice_config_dict(self) -> dict: """ 示例: {'voice_url': 'https%3A%2F%2Fboss.hdslb.com%2Flive-dm-voice%2Fb5b26e48b556915cbf3312a59d3bb2561627725945.wav %3FX-Amz-Algorithm%3DAWS4-HMAC-SHA256%26X-Amz-Credential%3D2663ba902868f12f%252F20210731%252Fshjd%252Fs3%25 2Faws4_request%26X-Amz-Date%3D20210731T100545Z%26X-Amz-Expires%3D600000%26X-Amz-SignedHeaders%3Dhost%26 X-Amz-Signature%3D114e7cb5ac91c72e231c26d8ca211e53914722f36309b861a6409ffb20f07ab8', 'file_format': 'wav', 'text': '汤,下午好。', 'file_duration': 1} """ if isinstance(self.voice_config, dict): return self.voice_config try: return json.loads(self.voice_config) except (json.JSONDecodeError, TypeError): return {} class GiftMessage: """ 礼物消息 :param gift_name: 礼物名 :param num: 数量 :param uname: 用户名 :param face: 用户头像URL :param guard_level: 舰队等级,0非舰队,1总督,2提督,3舰长 :param uid: 用户ID :param timestamp: 时间戳 :param gift_id: 礼物ID :param gift_type: 礼物类型(未知) :param action: 目前遇到的有'喂食'、'赠送' :param price: 礼物单价瓜子数 :param rnd: 随机数,可能是去重用的。有时是时间戳+去重ID,有时是UUID :param coin_type: 瓜子类型,'silver'或'gold',1000金瓜子 = 1元 :param total_coin: 总瓜子数 :param tid: 可能是事务ID,有时和rnd相同 """ def __init__( self, gift_name: str = None, num: int = None, uname: str = None, face: str = None, guard_level: int = None, uid: int = None, timestamp: int = None, gift_id: int = None, gift_type: int = None, action: str = None, price: int = None, rnd: str = None, coin_type: str = None, total_coin: int = None, tid: str = None, ): self.gift_name = gift_name self.num = num self.uname = uname self.face = face self.guard_level = guard_level self.uid = uid self.timestamp = timestamp self.gift_id = gift_id self.gift_type = gift_type self.action = action self.price = price self.rnd = rnd self.coin_type = coin_type self.total_coin = total_coin self.tid = tid @classmethod def from_command(cls, data: dict): return cls( gift_name=data['giftName'], num=data['num'], uname=data['uname'], face=data['face'], guard_level=data['guard_level'], uid=data['uid'], timestamp=data['timestamp'], gift_id=data['giftId'], gift_type=data['giftType'], action=data['action'], price=data['price'], rnd=data['rnd'], coin_type=data['coin_type'], total_coin=data['total_coin'], tid=data['tid'], ) class GuardBuyMessage: """ 上舰消息 :param uid: 用户ID :param username: 用户名 :param guard_level: 舰队等级,0非舰队,1总督,2提督,3舰长 :param num: 数量 :param price: 单价金瓜子数 :param gift_id: 礼物ID :param gift_name: 礼物名 :param start_time: 开始时间戳,和结束时间戳相同 :param end_time: 结束时间戳,和开始时间戳相同 """ def __init__( self, uid: int = None, username: str = None, guard_level: int = None, num: int = None, price: int = None, gift_id: int = None, gift_name: str = None, start_time: int = None, end_time: int = None, ): self.uid: int = uid self.username: str = username self.guard_level: int = guard_level self.num: int = num self.price: int = price self.gift_id: int = gift_id self.gift_name: str = gift_name self.start_time: int = start_time self.end_time: int = end_time @classmethod def from_command(cls, data: dict): return cls( uid=data['uid'], username=data['username'], guard_level=data['guard_level'], num=data['num'], price=data['price'], gift_id=data['gift_id'], gift_name=data['gift_name'], start_time=data['start_time'], end_time=data['end_time'], ) class SuperChatMessage: """ 醒目留言消息 :param price: 价格(人民币) :param message: 消息 :param message_trans: 消息日文翻译(目前只出现在SUPER_CHAT_MESSAGE_JPN) :param start_time: 开始时间戳 :param end_time: 结束时间戳 :param time: 剩余时间(约等于 结束时间戳 - 开始时间戳) :param id_: str,醒目留言ID,删除时用 :param gift_id: 礼物ID :param gift_name: 礼物名 :param uid: 用户ID :param uname: 用户名 :param face: 用户头像URL :param guard_level: 舰队等级,0非舰队,1总督,2提督,3舰长 :param user_level: 用户等级 :param background_bottom_color: 底部背景色,'#rrggbb' :param background_color: 背景色,'#rrggbb' :param background_icon: 背景图标 :param background_image: 背景图URL :param background_price_color: 背景价格颜色,'#rrggbb' """ def __init__( self, price: int = None, message: str = None, message_trans: str = None, start_time: int = None, end_time: int = None, time: int = None, id_: int = None, gift_id: int = None, gift_name: str = None, uid: int = None, uname: str = None, face: str = None, guard_level: int = None, user_level: int = None, background_bottom_color: str = None, background_color: str = None, background_icon: str = None, background_image: str = None, background_price_color: str = None, ): self.price: int = price self.message: str = message self.message_trans: str = message_trans self.start_time: int = start_time self.end_time: int = end_time self.time: int = time self.id: int = id_ self.gift_id: int = gift_id self.gift_name: str = gift_name self.uid: int = uid self.uname: str = uname self.face: str = face self.guard_level: int = guard_level self.user_level: int = user_level self.background_bottom_color: str = background_bottom_color self.background_color: str = background_color self.background_icon: str = background_icon self.background_image: str = background_image self.background_price_color: str = background_price_color @classmethod def from_command(cls, data: dict): return cls( price=data['price'], message=data['message'], message_trans=data['message_trans'], start_time=data['start_time'], end_time=data['end_time'], time=data['time'], id_=data['id'], gift_id=data['gift']['gift_id'], gift_name=data['gift']['gift_name'], uid=data['uid'], uname=data['user_info']['uname'], face=data['user_info']['face'], guard_level=data['user_info']['guard_level'], user_level=data['user_info']['user_level'], background_bottom_color=data['background_bottom_color'], background_color=data['background_color'], background_icon=data['background_icon'], background_image=data['background_image'], background_price_color=data['background_price_color'], ) class SuperChatDeleteMessage: """ 删除醒目留言消息 :param ids: 醒目留言ID数组 """ def __init__( self, ids: List[int] = None, ): self.ids: List[int] = ids @classmethod def from_command(cls, data: dict): return cls( ids=data['ids'], )
2022年12月06日
5 阅读
0 评论
0 点赞
2022-12-06
blivedm 项目阅读 之 handlers.py
Logging 官方文档# -*- coding: utf-8 -*- import logging #Python中的logging模块,是用于实现日志的功能。 #此日志的功能,简单的说,可以控制需要输出的信息,输出(显示)到哪里;相关要显示的信息,有很多种等级,比如info,warning,error等 # """最常见的应用是: 把info,warning,error同时输出到cmd窗口(显示)和(写入)log文件中; 其中info表示告诉用户,这个是普通的信息; warning和error分别提醒用户,有些警告,甚至是错误信息,需要用户注意; 把debug类信息,只输出(写入)到log文件中; """ from typing import * from . import client as client_ from . import models __all__ = ( 'HandlerInterface', 'BaseHandler', ) """以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。""" # #Python模块__all__变量 #该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员。 #也就是说,只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。 logger = logging.getLogger('blivedm') #返回一个logger对象 # 常见可忽略的cmd IGNORED_CMDS = ( 'COMBO_SEND', 'ENTRY_EFFECT', 'HOT_RANK_CHANGED', 'HOT_RANK_CHANGED_V2', 'INTERACT_WORD', 'LIVE', 'LIVE_INTERACTIVE_GAME', 'NOTICE_MSG', 'ONLINE_RANK_COUNT', 'ONLINE_RANK_TOP3', 'ONLINE_RANK_V2', 'PK_BATTLE_END', 'PK_BATTLE_FINAL_PROCESS', 'PK_BATTLE_PROCESS', 'PK_BATTLE_PROCESS_NEW', 'PK_BATTLE_SETTLE', 'PK_BATTLE_SETTLE_USER', 'PK_BATTLE_SETTLE_V2', 'PREPARING', 'ROOM_REAL_TIME_MESSAGE_UPDATE', 'STOP_LIVE_ROOM_LIST', 'SUPER_CHAT_MESSAGE_JPN', 'WIDGET_BANNER', ) # 已打日志的未知cmd logged_unknown_cmds = set() class HandlerInterface: """ 直播消息处理器接口 """ async def handle(self, client: client_.BLiveClient, command: dict): raise NotImplementedError #raise 手动抛出异常 """ raise 语句的基本语法格式为: raise [exceptionName [(reason)]] 其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。 也就是说,raise 语句有如下三种常用的用法: raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。 raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。 raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。 raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。 try: a = input("输入一个数:") #判断用户输入的是否为数字 if(not a.isdigit()): raise ValueError("a 必须是数字") except ValueError as e: print("引发异常:",repr(e)) """ ''' raise NotImplementedError 在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现。 如果要求其子类一定要实现,不实现的时候会导致问题,那么采用raise的方式就很好。 程序识别到了这个方法并没有在子类中实现却被调用了。且只有这个子类的实例化对象调用相应的方法的时候才会报错。 只要相应的方法接口进行了实现,在执行的时候未实施的错误便不会报出。 在此例中对应的是handle方法 ''' class BaseHandler(HandlerInterface): """ 一个简单的消息处理器实现,带消息分发和消息类型转换。继承并重写_on_xxx方法即可实现自己的处理器 """ def __heartbeat_callback(self, client: client_.BLiveClient, command: dict): return self._on_heartbeat(client, models.HeartbeatMessage.from_command(command['data'])) def __danmu_msg_callback(self, client: client_.BLiveClient, command: dict): return self._on_danmaku(client, models.DanmakuMessage.from_command(command['info'])) def __send_gift_callback(self, client: client_.BLiveClient, command: dict): return self._on_gift(client, models.GiftMessage.from_command(command['data'])) def __guard_buy_callback(self, client: client_.BLiveClient, command: dict): return self._on_buy_guard(client, models.GuardBuyMessage.from_command(command['data'])) def __super_chat_message_callback(self, client: client_.BLiveClient, command: dict): return self._on_super_chat(client, models.SuperChatMessage.from_command(command['data'])) def __super_chat_message_delete_callback(self, client: client_.BLiveClient, command: dict): return self._on_super_chat_delete(client, models.SuperChatDeleteMessage.from_command(command['data'])) #在定义函数时,变量默认值用=,变量默认类型用: """ Typing包中的Optional类 意思是可选类型,作用几乎和带默认值的参数等价,不同的是使用Optional会告诉你的IDE或者框架:这个参数除了给定的默认值外还可以是None,而且使用有些静态检查工具如mypy时,对 a: int =None这样类似的声明可能会提示报错,但使用a :Optional[int] = None不会。 Typing包中的Callable 是一个可调用对象类型,查看是否可调用 第一个用法:isinstance(对象, Callable) # 返回True或False 这里是第二个用法Callable 作为函数参数 Callable 作为函数参数使用,其实只是做一个类型检查的作用,检查传入的参数值 get_func 是否为可调用对象 第三个用法Callable 作为函数返回值使用,其实只是做一个类型检查的作用,看看返回值是否为可调用对象 #def XXX -> 数据类型 #标注返回值的数据类型 #def f(ham: str, eggs: str = 'eggs') -> str: def get_name_return() -> Callable[[str], None]: return print_name # 等价写法,相当于直接返回一个函数对象 def get_name_test(): return print_name """ """这里应该是定义了一个callback的数据结构(字典),然后定义了字典的Optional默认参数,最后检查其可调用性""" # cmd -> 处理回调 _CMD_CALLBACK_DICT: Dict[ str, Optional[Callable[ ['BaseHandler', client_.BLiveClient, dict], Awaitable ]]# ] = { # 收到心跳包,这是blivedm自造的消息,原本的心跳包格式不一样 '_HEARTBEAT': __heartbeat_callback, # 收到弹幕 # go-common\app\service\live\live-dm\service\v1\send.go 'DANMU_MSG': __danmu_msg_callback, # 有人送礼 'SEND_GIFT': __send_gift_callback, # 有人上舰 'GUARD_BUY': __guard_buy_callback, # 醒目留言 'SUPER_CHAT_MESSAGE': __super_chat_message_callback, # 删除醒目留言 'SUPER_CHAT_MESSAGE_DELETE': __super_chat_message_delete_callback, }#大括号括出的是字典,中括号括出的是列表 # 忽略其他常见cmd for cmd in IGNORED_CMDS: _CMD_CALLBACK_DICT[cmd] = None del cmd async def handle(self, client: client_.BLiveClient, command: dict): cmd = command.get('cmd', '') pos = cmd.find(':') # 2019-5-29 B站弹幕升级新增了参数 if pos != -1: cmd = cmd[:pos] if cmd not in self._CMD_CALLBACK_DICT: # 只有第一次遇到未知cmd时打日志 if cmd not in logged_unknown_cmds: logger.warning('room=%d unknown cmd=%s, command=%s', client.room_id, cmd, command) logged_unknown_cmds.add(cmd) return callback = self._CMD_CALLBACK_DICT[cmd] if callback is not None: await callback(self, client, command) async def _on_heartbeat(self, client: client_.BLiveClient, message: models.HeartbeatMessage): """ 收到心跳包(人气值) """ async def _on_danmaku(self, client: client_.BLiveClient, message: models.DanmakuMessage): """ 收到弹幕 """ async def _on_gift(self, client: client_.BLiveClient, message: models.GiftMessage): """ 收到礼物 """ async def _on_buy_guard(self, client: client_.BLiveClient, message: models.GuardBuyMessage): """ 有人上舰 """ async def _on_super_chat(self, client: client_.BLiveClient, message: models.SuperChatMessage): """ 醒目留言 """ async def _on_super_chat_delete(self, client: client_.BLiveClient, message: models.SuperChatDeleteMessage): """ 删除醒目留言 """参考链接 Python - typing 模块 —— Callable Python:Optional和带默认值的参数 ython编程中NotImplementedError的使用方法[Python模块学习——logging](https://www.cnblogs.com/captain_jack/archive/2011/01/21/1941453.html) [Python日志库logging总结-可能是目前为止将logging库总结的最好的一篇文章](https://cloud.tencent.com/developer/article/1354396#:~:text=2%E3%80%81logging%20%E6%B5%81%E7%A8%8B%201%20%E5%88%A4%E6%96%AD%20Logger%20%E5%AF%B9%E8%B1%A1%E5%AF%B9%E4%BA%8E%E8%AE%BE%E7%BD%AE%E7%9A%84%E7%BA%A7%E5%88%AB%E6%98%AF%E5%90%A6%E5%8F%AF%E7%94%A8%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%8F%AF%E7%94%A8%EF%BC%8C%E5%88%99%E5%BE%80%E4%B8%8B%E6%89%A7%E8%A1%8C%EF%BC%8C%E5%90%A6%E5%88%99%EF%BC%8C%E6%B5%81%E7%A8%8B%E7%BB%93%E6%9D%9F%E3%80%82%202%20%E5%88%9B%E5%BB%BA,%E5%A6%82%E6%9E%9C%E4%BC%A0%E5%85%A5%E7%9A%84%20Handler%20%E5%A4%A7%E4%BA%8E%20Logger%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E7%9A%84%E7%BA%A7%E5%88%AB%EF%BC%8C%E4%B9%9F%E5%8D%B3%20Handler%20%E6%9C%89%E6%95%88%EF%BC%8C%E5%88%99%E5%BE%80%E4%B8%8B%E6%89%A7%E8%A1%8C%EF%BC%8C%E5%90%A6%E5%88%99%EF%BC%8C%E6%B5%81%E7%A8%8B%E7%BB%93%E6%9D%9F%E3%80%82%20%E6%9B%B4%E5%A4%9A%E9%A1%B9%E7%9B%AE) [Python模块和包](http://c.biancheng.net/python/module_package/) Python 中下划线的 5 种含义
2022年12月06日
5 阅读
0 评论
0 点赞
2022-12-06
Python Async/Await入门
本文主要参照知乎: Python Async/Await入门指南简要解释await的意义一句话版本:asyncio.wait会通过事件循环串联起多个异步函数(协程),在异步函数中会有需要await的对象,多个函数同时去调用await后的运算,一旦任意await得到结果,就去处理后面的逻辑这篇文章评论下的一位同志看了几篇文章,说一下拙见,用这个await的场景大概是你有一堆异步函数需要调用,比如washing1 ,washing2,washing3,三个里面都有await,在主函数里调用这三个异步函数,然后三个函数都启动了,哪个await等到结果了,线程就去处理后面的逻辑,他们一般会这样写这样实际执行时间是5秒多,而不是3 +2 +5。感觉还是要配合异步模块好一点# async def washing1(): await asyncio.sleep(3) # 使用 asyncio.sleep(), 它返回的是一个可等待的对象 print('washer1 finished') async def washing2(): await asyncio.sleep(2) print('washer2 finished') async def washing3(): await asyncio.sleep(5) print('washer3 finished') # 1. 创建一个事件循环 loop = asyncio.get_event_loop() # 2. 将异步函数加入事件队列 tasks = [ washing1(), washing2(), washing3(), ] # 3. 执行事件队列, 直到最晚的一个事件被处理完毕后结束 loop.run_until_complete(asyncio.wait(tasks))事件循环事件循环参考文档 事件循环是每个 asyncio 应用的核心。 事件循环会运行异步任务和回调,执行网络 IO 操作,以及运行子进程。 asyncio.get_running_loop()返回当前 OS 线程中正在运行的事件循环。 asyncio.get_event_loop()获取当前事件循环。 如果当前 OS 线程没有设置当前事件循环,该 OS 线程为主线程,并且 set_event_loop() 还没有被调用,则 asyncio 将创建一个新的事件循环并将其设为当前事件循环。 知识补充Python random模块和函数Python中的random模块用于生成随机数。import random random.random() print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数 print( random.random() ) # 产生 0 到 1 之间的随机浮点数 print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数 print( random.choice('tomorrow') ) # 从序列中随机选取一个元素 print( random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')# 随机字符 print( random.sample('zyxwvutsrqponmlkjihgfedcba',5)# 多个字符中生成指定数量的随机字符: print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数 a=[1,3,5,6,7] # 将序列a中的元素顺序打乱 random.shuffle(a) # 将序列a中的元素顺序打乱
2022年12月06日
4 阅读
0 评论
0 点赞
2022-10-28
Conda 安装R
anaconda下载地址 一路回车加Yes即可Please, press ENTER to continue >>> # 此处直接点击enter即可 =================================== Miniconda End User License Agreement =================================== ....... # 这里点击好几次空格键,直到出现下面行 Do you accept the license terms? [yes|no] [no] >>> # 这里输入yes,点击enter # 如果输入错误,比如输入yess,又删除不了,此时你应该按enter,重新输入yes即可 [/home/you/miniconda2] >>> # 遇到此处时,直接enter即可 # 这里的绝对路径是指miniconda2的安装路径 installation finished. Do you wish the installer to initialize Miniconda2 in your /home/you/.bashrc ? [yes|no] [no] >>> # 这里输入yes # 刚开始学的人最好输入yes,目的是让conda自动给你配置环境变量 # 输入yes的结果是:~/.bashrc这里文件里最后几行多了conda的配置信息 # less ~/.bashrc,多出来的配置信息第一行如下: # added by Miniconda2 4.5.12 installer ....... Thank you for installing Miniconda2! # 出现这个代表安装成功 # 执行下面语句 source ~/.bashrc # 执行后,本身就是没有任何提示 conda --help # 出现conda的帮助文档信息,即表明conda安装成功 # 这里很重要,不管安装什么软件,都要检测是否安装成功! # 如下所示 usage: conda [-h] [-V] command ... conda is a tool for managing and deploying applications, environments and packages. Options: ...... # 继续调取conda子命令的帮助文档,如 conda create --help conda install --help配置源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda conda config --set show_channel_urls yes如果提示CondaHTTPError: HTTP 000 CONNECTION FAILED for url下载时间过长,会自动断开,就会提示连接失败,设置延时1000s,如果还是不行的话就设置2000s。conda config --set remote_read_timeout_secs 1000.0将上述语句,一句一句运行在linux命令行上,即复制一句,按一下enter键,原则上没有任何提示即为设置成功; 配置信息保存在 ~/.condarc 里,cat ~/.condarc即可查看!conda info --envs # 查看环境 conda create -n myenv # 创建一个环境 source activate myenv # 激活进入 myenv环境 conda deactivate # 退出当前环境 conda env remove --name myenv # 移除环境 conda info --envs # 查看环境 conda create -n R3.5 # 创建名为R3.5的环境 source activate R3.5 conda list #查看当前安装的软件 conda install r-base #安装R语言 conda install r-stringi # R包 以 r- 开头 conda deactivate # 退出当前环境 conda create -n rna # 创建一个小环境名为rna conda install python=2 # 安装python 2版本 # 以上两句话可以等同于一句命令:conda create -n rna python=2 conda info -e conda info --envs conda env list # 都是来查看已经存在小环境名的 # 运行后如下:rna即为刚刚建立成功的小环境名 $ conda info -e # conda environments: # base * /home/you/miniconda2 rna /home/you/miniconda2/envs/rna创建小环境后,安装软件前,一定要进入/激活小环境在安装,否则会安装到当前账户环境下。source activate rna:激活小环境名为rna的环境本文参照于
2022年10月28日
21 阅读
0 评论
0 点赞
2022-08-27
Openwrt修改网卡为dhcp
vi /etc/config/network找到对应的网卡,eth0把static 修改为dhcp即可记得删除bridge这一行尽量最后只留下两行如图
2022年08月27日
96 阅读
0 评论
0 点赞
1
...
3
4
5
...
17