关于python:解读最佳实践倚天710-ARM芯片的-PythonAI-算力优化

编者按:在刚刚完结的 PyCon China 2022 大会上,龙蜥社区开发者朱宏林分享了主题为《ARM 芯片的 Python+AI 算力优化》的技术演讲。本次演讲,作者将向大家介绍他们在倚天 710 ARM 芯片上发展的 Python+AI 优化工作,以及在 ARM 云平台上部署 Python+AI 工作的最佳实际。 以下为本次演讲内容: (图/朱宏林现场演讲) 咱们的场景是 ARM 平台的和 AI 相干的工作,次要的指标是进行性能优化,具体来说咱们首先关注的是深度学习推理工作(inference task),次要起因也是来自于业务需要。 这里说的 ARM 平台不是咱们了解的终端设备,比方手机之类的,而是指服务端平台。在大家印象中,AI 工作,特地是深度学习的程序个别是跑在 GPU 或者 x86 的 CPU 上,出于功耗、老本、性能等因素的思考,云厂商逐渐开始建设 ARM 架构的服务平台,这是一个趋势。当然 ARM 平台还不是很成熟,许多软件还无奈胜利跑起来,更不要说晋升性能了。 咱们想要吸引一部分用户将AI利用从原先的 x86 平台上迁徙到 ARM 平台上。这就要求 ARM 平台能提供更好的性能,或者更好的性价比。所以说如何整合 Python+AI 的相干软件使其施展最好的性能成为了咱们关注的重点。 下文的分享整体分为两局部,一部分是介绍咱们进行的优化工作,次要是跟矩阵乘法相干的优化,第二局部是对于 Python AI 利用在 ARM 云平台-倚天 710 上的最佳实际。 一、优化工作介绍 后面说咱们的优化是和矩阵乘法相干的,那首先须要阐明为什么咱们会关注到这个。 这里有一个绕不开的场景就是深度学习,不论是前几年出名的 AlphaGo,还是以后炽热的 ChatGPT,都用到了大量深度学习的技术,深度学习自身只是AI的一个分支,但却影响宽泛,不容忽视。所以咱们从深度学习开始切入,从以后最宽泛应用的深度学习框架,TensorFlow 和 PyTorch 开始。此外,咱们还须要联合硬件场景,即后面说到的 ARM 服务端平台,对于阿里云来说就是联合倚天 710 芯片。 ...

December 29, 2022 · 2 min · jiezi

关于python:poetry-下运行-dbtqbit

前言dbt 是 Data Build Tool 的简称,目前由 dbt labs 公司负责开发和保护,公司的前身是Fishtown Analytics。dbt 次要解决 ETL 中的 T(transform)dbt 次要分为两局部 dbt Core: cli 命令行工具dbt Cloud: 云服务dbt Core 的 github 地址是:https://github.com/dbt-labs/d...qbit 集体感觉 dbt Core 的官网入门教程不敌对,一开始就要求谷歌的 BigQuery 服务、GitHub 账号等。本文次要参照:【大数据架构之旅】2 从零起步学 dbt技术栈Windows 10Python 3.8.10poetry 1.3.1git 2.35.1.windows.2PostgreSQL 15.1poetry 我的项目配置.../test_dbt/pyproject.toml [tool.poetry]name = "test-dbt"version = "0.1.0"description = ""authors = ["qbit <q@bit.cn>"]readme = "README.md"packages = [{include = "test_dbt"}][[tool.poetry.source]]name = "aliyun"url = "https://mirrors.aliyun.com/pypi/simple/"default = true[tool.poetry.dependencies]python = "^3.8"dbt-core = "~1.3.1"dbt-postgres = "~1.3.1"[build-system]requires = ["poetry-core"]build-backend = "poetry.core.masonry.api"本文中的 poetry 我的项目文件夹 指 .../test_dbt/本文中的 dbt 我的项目文件夹 指 .../test_dbt/dbt_demo/创立数据库与初始化我的项目在 PostgreSQL 外面新建数据库 dbt-demo初始化 dbt 我的项目,在 .../test_dbt/ 目录下执行以下命令 ...

December 28, 2022 · 5 min · jiezi

关于python:oeasypython0033回车carriagereturnfiglet字体变大

回到结尾回顾上次内容过程前后台切换 ctrl + z 把以后过程切换到后盾并暂停jobs 查看所有作业用 fg 能够把后盾过程再切回前台 fg %1 能够把指定的工作切回前台用 bg 能够让过程在后盾运行过程查问 ps -elf 查看所有过程信息ps -lf 查看本终端相干过程信息kill -9 PID 给过程发送死亡信号pstree -h 能够查看过程树运行多个 python3 show_time.py 的话 各个过程独立python3 show_time.py 大略 7M各占内存这个切过程很好用 不过运行过程的时候总是满屏刷工夫能够固定在屏幕的某个地位刷新工夫吗?回到从头咱们从新去游乐场 \n是咱们相熟的转义字符咱们先温习一下\n 这次把 \n 换成 \r \r的作用是回到行头如果原来输入的字符串比新的长 怎么办呢?return\r 回车return只负责回到行头不换行 过程 先输入abcdef而后回到行头再输入123后果就是123def不要翻篇 本人尝试批改show_time.py让输入工夫固定在一行联合程序这个程序和 sleep 的联合很简略 只须要把输入的字符串后面加上\r并且把结尾默认的 end="\n" 换成 end="" 试验胜利 真的定在那儿刷新了突发奇想 如果我把结束符设置为"\r"会如何呢?尝试#!usr/bin/python3import timewhile True: print(time.asctime(),end='\r') time.sleep(1)想到就去试试 果然 不出所料都给删除了没事 试了也就高兴了新问题还有就是字有点小 能够变大么? 要清清楚楚看报时字体变大#装置figletsudo apt install figlet#运行figletfiglet "oeasy"#利用管道应用figletecho "oeasy" | figlet尝试应用 为什么能够变大呢?寻找原理 figlet有专门的大字体字库 ...

December 28, 2022 · 1 min · jiezi

关于python:加载速度提升-15关于-Python-启动加速探索与实践的解析

编者按:在刚刚完结的 PyCon China 2022 大会上,龙蜥社区开发者严懿宸分享了主题为《Python 启动减速的摸索与实际》的技术演讲。本次演讲,作者将从 CPython 社区相干工作、本计划的设计及实现,以及业务层面的集成等方面进行介绍。 以下为本次演讲内容: 一、Python 启动速度简析首先从一个 Python 3 中空解释器启动工夫的坏事剖析开始。咱们能够看到,次要的耗时都和 Python 包加载无关。 其中,CPU 工夫中包加载占据了 30% 左右的工夫;而 37% 的等待时间中,磁盘 IO 等破费的工夫也和包加载有较大的关联。 相熟 Python 机制的敌人大略晓得,Python 中加载一个包首先会搜寻对应的 pyc 文件,这是一种序列化的字节码格局。找到之后会对其进行反序列化,并执行其中的代码。如对应的 pyc 文件不存在,会从新编译 py 文件失去字节码,并序列化为 pyc 文件长久化保留。咱们优化的次要指标次要集中在加载包这个过程,心愿可能至多免去每次查找、读取、反序列化的开销。 以 Python3.10 为例,这里是应用 python 解释器启动一个空语句的所需工夫,同时应用了 -Ximporttime 打印出过程中加载每一个包的耗时。能够粗略地看到,包加载工夫大概占了总工夫的 30% 左右。 咱们发现这种状况和 Java 虚拟机相似。在 Java 中,Java 会首先将 Java 源代码编译为 Java 字节码,随后由 Java 命令执行。咱们晓得 Java 的劣势并不包含启动速度,这种流程也是起因之一。 那么 Java 如何局部解决这个问题呢? 二、PyCDS (代码对象共享)设计与实现 Java 中有一个叫做 CDS/AppCDS 的机制,通过将 Java 字节码和一些辅助数据长久化保留,在后续启动时应用 mmap 加载,节约了磁盘 IO 和解析验证 class 文件的开销。 ...

December 27, 2022 · 1 min · jiezi

关于python:高性能-Python-web-框架-Blacksheep-初见

Python web 框架性能比照一说到 Python 大家多半最先想到的就是它代码的简洁与性能的孱弱。在我所应用体验过的 Python web 框架中 Tornado 性能最好,Flask 次之,Django 最差;然而从开发的速度与前期保护的老本来说,它们的排名又应该反过来。近些年来又有很多后起之秀,比方:sanic 和 fastapi,不由得让人好奇到底哪一个才是性能最好的那个。我在这里帮大家找到了这样一个仓库,其作者在 Docker 的根底上对支流的 Python web 框架进行了基准测试和比照,从后果来看取得第一名的是一个名不见经传的叫:Blacksheep 的框架。我起初 fork 了此 repo 并更新了其中所有框架到最新版本后,测试进去的第一名仍然是它。所以我想写一篇文章记录并介绍下它。klen/py-frameworks-bench: Another benchmark for some python frameworks (github.com) Blacksheep我的项目repo: Neoteroi/BlackSheep: Fast ASGI web framework for Python (github.com) 我的项目文档:BlackSheep (neoteroi.dev) 作者介绍此我的项目的文章:Presenting BlackSheep, one of today's fastest web frameworks for Python – Roberto Prevato – Applications architect, DevOps, graphic designer, metal head passionate of philosophy. 据作者所说,他是受 Flask and ASP.NET Core 启发开发了 Blacksheep,其性能好的起因次要有三点: ...

December 27, 2022 · 1 min · jiezi

关于python:交互式仪表板Python轻松完成⛵

作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/article-detail/410 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容 引言在本篇内容中,ShowMeAI将给大家解说应用 ipywidget 模块创立交互式仪表板。 咱们本次用到的数据集是 Kaggle 的 CardioGoodFitness,大家能够通过 ShowMeAI 的百度网盘地址下载。 实战数据集下载(百度网盘):公众号『ShowMeAI钻研核心』回复『实战』,或者点击 这里 获取本文 [[41]ipywidgets:应用Python创立交互式仪表板](https://www.showmeai.tech/art...) 『CardioGoodFitness 数据集』 ⭐ ShowMeAI官网GitHub:https://github.com/ShowMeAI-Hub 首先,咱们须要导入所需的模块。 import pandas as pdimport ipywidgets import seaborn as snsimport matplotlib.pyplot as plt咱们先看一下数据变量。数据中蕴含 2 个连续变量,支出 Income 和英里数 Miles。 看板Demo实现:理解Miles的散布 筹备工作ipywidget 模块蕴含了很多可用的小部件。在这个演示中,咱们将应用下拉框抉择类别数据,以便更好地理解里程散布。咱们将抉择箱线图来绘制每个类别的里程数据。 %matplotlib widget# Drop down for boxplot variable to be selectdrop_down_name = ipywidgets.Dropdown(options=list(df.drop(['Miles','Income'],axis=1).columns), value=list(df.drop(['Miles','Income'],axis=1).columns)[0], description='Columns:', disabled=False)接下来,咱们能够创立一个函数,容许输出用于绘制英里箱线图的列名称。 #selected_vals = column used to plotdef boxplot(selected_vals): plt.close('all') fig = plt.figure(figsize=(9,5)) plt.style.use('seaborn') sns.boxplot(df[selected_vals],df['Miles']) plt.title('Boxplot of miles for' + selected_vals) plt.show()之后,咱们须要创立一个 layout/布局,Jupyter 交互式小部件具备一个 layout 属性,蕴含了许多影响小部件布局的 CSS 属性。 ...

December 27, 2022 · 1 min · jiezi

关于python:oeasypython0033任务管理jobs切换任务进程树结构fg

查看过程回顾上次内容上次先过程查问 ps -elf 查看所有过程信息ps -lf 查看本终端相干过程信息杀死过程 kill -9 PID 给过程发送死亡信号运行多个 python3 show_time.py 的话 各个过程独立python3 show_time.py 大略 8+M各占内存这些过程之间是什么关系呢? 具体查问zsh过程相干的 3 个过程 zsh(以后的 shell 环境) zsh(shell自身)过程/usr/bin/python3 /home/shiyanlou/sleep.py 输入工夫的python程序ps -lf 查问过程的ps过程 这过程之间有父子关系父子关系pid 是指过程的 id process idppid 是指 父过程 id parent process idppid 是 pid 的爸爸 ps 和 python3 都是 zsh 的子过程python3 这个过程占内存是 SZ 4860 个 Page每个 page 大略 4K 总共 10+M python3 这个文件不是自身才 4.3M 么 都装进内存也就是 4.3M都装进内存页没有 10+M 呀?10+M 的起因除了根底的局部(内建模块函数)之外 print()ord()、chr()int()、hex()、bin()还有新加载的局部 sleep.py还有 import 进来的 time 这个 module理论调配ps -o pid,ppid,sz,vsz,rss,cmdSZ 是欲调配的内存用页(4K)来当单位VSZ 是欲调配的内存用 K 来当单位 ...

December 26, 2022 · 1 min · jiezi

关于python:sqlalchemy-使用-filter-多条件查询当某个条件为空时就忽略该条件

需要:应用 sqlalchemy 进行多条件查问时,当某个条件为空就疏忽该条件. 知识点: filter 应用 or_ 来进行 或 的运算;func 能够进行 总量统计.代码性能点: 如果 user_id 有值则取传来的值;如果没有传值,则查问 user_id 不为空的所有数据;如果 state 有值则取传来的值;如果没有传值,则查问 state 不为空的所有数据;实现代码: from operator import or_from sqlalchemy import text, funcloan_output = db.query(self.model).filter(or_(Loan.user_id == user_id, Loan.user_id != None), or_(Loan.state == state, Loan.state != None)).order_by().all()# 获取符合条件的总数据量count = db.query(func.count(Loan.id)).filter(or_(Loan.user_id == user_id, Loan.user_id != None), or_(Loan.state == state, Loan.state != None)).scalar()以上代码有个数据层面的问题,如果数据库中有 字段为空值的,那么是查不到的.

December 25, 2022 · 1 min · jiezi

关于python:oeasypython0032杀死进程进程后台运行不输出nohupps显示进程

查看过程回顾上次内容上次先ctrl + z 挂起过程 而后运行 bg 程序持续跑起来而且一直输入到规范输入流甚至连ctrl + c 都无奈完结过程了这可怎么办呢?只能新开一个终端想方法查问过程搜寻 debian过程查问 找到具体方法过程具体方法 入手试试新开一个终端 运行ps -elf 查看到两条过程信息 看起来上一个zsh就是pid为281的过程记住281这个pid当初我想把这个278过程干掉怎么办?搜寻一下搜寻 搜寻后果 杀意搜到了一个可怕的程序叫做 kill 他能够给指定 pid 的过程发送信号 pid的编号能够通过ps -elf的后果中找到找到上一个zsh的pid就是刚刚的281#杀死过程kill -9 PID-9 就是死亡信号 发过来之后那个过程就要自尽 没有任何过程违心承受着这个信号君要臣死,臣不得不死权限对过程是如许重要啊然而接到了就要执行阿啊阿啊阿啊·~ 真的把之前的那个zsh过程干掉了 窗口都隐没了然而看到的过程太多了 但我只想要和以后zsh无关的过程zsh过程#查问过程#咱们只有和zsh这个过程相干的#把e去掉ps -lf这样只呈现本shell相干的过程 kill起来比拟不便 如同还挺好玩 再建几个过程放后盾试着kill一下启动更多新过程先启动更多的报时程序 再试着一个个地kill如何了解suspend呢?suspend词源suspend = sus + pend sus来自于sub 上面 sustain 撑持;接受(sus+tain握住→在上面握住→撑持)suspect 狐疑 (sus+pect看→在上面看一看→狐疑)susceptive 有承受力的;敏感的(sus+cept拿+ive→有拿下的能力→有承受力的)suspend是什么意思呢?-pendpend 来自于 *(s)pen- *(s)pen- 意思为悬挂带着 depend de-, 向下,来到 -pend, 悬挂即悬挂点引申义依附denpendentindependentappend 词根词缀: ap- 来 , 邻近-pend- 悬挂垂→附丽expend ex- 出 , 向外 + -pend- 领取spendsuspend ...

December 24, 2022 · 1 min · jiezi

关于python:验证码逆向专栏某验三代滑块验证码逆向分析

申明本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除! 本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】分割作者立刻删除! 逆向指标指标:某验三代滑块验证码,底图还原及 w 参数逆向验证码 demo 列表:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby8=滑块验证码:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s加密算法:RSA、AES、MD5验证码流程剖析进入网页后,关上开发者人员工具进行抓包 1.未点击按钮进行验证之前,Network 中抓包到了以下信息: register-slide?t=xxx:注册滑块申请,响应预览中返回的信息中重要的是 gt 和 challenge,gt 是固定值,不同网页对应不同的 gt 值,相似于特色码,challenge 的值每次刷新页面都会变动,gt 参数会通过 url string 的模式传递给 gettype.php: gettype.php?gt=xxx&callback=xxx:获取验证码,HTTP 申请中不同的申请形式和设置不同的 Content-Type 时,参数传递的形式会不一样,个别为 Query String Parameters、Form Data、Request Payload,这里是 Query String Parameters,在 GET 申请时,参数会以 url string 的模式进行传递,即 ? 后的字符串则为其申请参数,并以 & 作为分隔符,这里传递了 gt 参数的值以及 callback,callback 为 geetest_ + 工夫戳: 响应预览中返回了一些 js 文件及对应的版本号: 第一个 get.php?xxx,url 中传递了一些参数,要害局部如下: gt:register-slide 响应返回的 gt 值challenge:register-slide 响应返回的 challenge 值w:对轨迹、滑动工夫等进行加密后的参数,该网站第一个 w 值能够间接置空callback:geetest_ + 工夫戳 ...

December 23, 2022 · 7 min · jiezi

关于python:pandas-将函数应用到列qbit

前言环境 Python 3.8Pandas 1.4.4注释初始化数据 >>> import pandas as pd>>> df0 = pd.DataFrame(data=[{'name': '张三', 'tag': '跑步', 'title': 'MAN'}, {'name': '王二', 'tag': '足球;电影', 'title': '舅舅;舅舅'}] )>>> df0 name tag title 0 张三 跑步 MAN 1 王二 足球;电影 舅舅;舅舅定义去重函数 def UniqItems(items: str): iset = set() for item in items.split(';'): item = item.strip() if not item: continue iset.add(item) return ';'.join(iset)单列去重(将函数利用到某列的单元格) >>> df1 = df0.copy()>>> df1['title'] = df1['title'].map(UniqItems)>>> df1 name tag title 0 张三 跑步 MAN 1 王二 足球;电影 舅舅所有列去重(将函数利用到所有单元格) ...

December 23, 2022 · 1 min · jiezi

关于python:Frida工具objection

Objection介绍objection是一个基于Frida开发的命令行工具,它能够很不便的Hook Java函数和类,并输入参数,调用栈,返回值。objection装置pip install objectionobjection命令查看objection --helpobjection启动(保障frida-server的启动)1.默认启动objection -g packageName explore2.指定ip和端口的连贯objection -N -h 192.168.0.0 -p 9999 -g packageName explore3.spawn启动,为了防止错过hook机会,采纳附加模式,在objection 启动时就注入appobjection -g packageName explore --startup-command "android hooking watch class 'com.xx.classname"4.spawn启动-打印参数、返回值、函数调用栈objection -g packageName explore --startup-command "android hooking watch class_method 'com.classname.methedname' --dump-args --dump-return --dump-backtrace"–-dump-args: 显示参数; --dump-return: 显示返回值; --dump-backtrace: 显示堆栈常用命令jobs list # 查看 hook 的工作有多少个jobs kill jobid # 把正在 hook 的工作敞开memory list modules # 枚举内存中所有模块memory list exports 文件名.so # 枚举模块中所有导出函数memory search # 内存搜寻android hooking list classes # 列出内存中所有的类android hooking list class_methods 包名.类名 # 列出类的所有办法android hooking search classes 包名蕴含的关键词 # 在内存中所有已加载的类中搜寻蕴含特定关键词的类android hooking list activities //枚举activityandroid intent launch_activity [activity_class] //启动activityandroid hooking list services //枚举servicesandroid intent launch_service [services_class] //启动servicesandroid hooking watch class 包名.类名 # hook类的所有办法android hooking watch class_method 包名.类名.办法 # 默认会Hook办法的所有重载android hooking watch class_method 包名.类名.办法 "参数1,参数2" # 如果只需hook其中一个重载函数 指定参数类型 多个参数用逗号分隔# hook办法的参数、返回值和调用栈(–dump-args: 显示参数; --dump-return: 显示返回值; --dump-backtrace: 显示堆栈)android hooking watch class_method 包名.类名.办法 --dump-args --dump-return --dump-backtraceandroid heap search instances 包名.类名 --fresh # 搜寻堆中的实例android heap execute 地址(hashcode的地址) 办法名 # 调用实例的办法android hooking set return_value com.xxx.xxx.methodName false 设置返回值(只反对bool类型)android sslpinning disable 屏蔽SSL 校验, 使得ssl pinning生效基于frida的objection及其插件wallbreaker 命令列表! # 执行操作系统的命令(留神:不是在所连贯device上执行命令)android # 执行指定的 Android 命令 clipboard monitor deoptimize # Force the VM to execute everything in the interpreter heap evaluate # 在 Java 类中执行 JavaScript 脚本。 execute # 在 Java 类中执行 办法。android heap execute 实例ID 实例办法 print search instances # 在以后Android heap上搜寻类的实例。android heap search instances 类名 hooking generate class # A generic hook manager for Classes simple # Simple hooks for each Class method get current_activity # 获取以后 前景(foregrounded) activity list activities # 列出曾经注销的 Activities class_loaders # 列出曾经注销的 class loaders class_methods # 列出一个类上的可用的办法 classes # 列出以后载入的所有类 receivers # 列出曾经注销的 BroadcastReceivers services # 列出曾经注销的 Services search classes 关键字 # 搜寻与名称匹配的Java类 methods 关键字 # 搜寻与名称匹配的Java办法 set return_value # 设置一个办法的返回值。只反对布尔返回 watch class # Watches for invocations of all methods in a class class_method # Watches for invocations of a specific class method intent launch_activity # 应用Intent启动Activity类 launch_service # Launch a Service class using an Intent keystore clear # 革除 Android KeyStore list # 列出 Android KeyStore 中的条目 watch # 监督 Android KeyStore 的应用 proxy set # 为应用程序设置代理 root disable # 试图禁用 root 检测 simulate # 试图模仿曾经 root 的环境 shell_exec # 执行shell命令 sslpinning disable # 尝试禁用 SSL pinning 在各种 Java libraries/classes ui FLAG_SECURE # Control FLAG_SECURE of the current Activity screenshot # 在以后 Activity 进行截图cd # 扭转当前工作目录commands clear # 革除以后会话命令的历史记录 history # 列出以后会话命令历史记录 save # 将在此会话中运行的所有惟一命令保留到一个文件中env # 打印环境信息evaluate # 执行 JavaScript。( Evaluate JavaScript within the agent )exit # 退出file cat # 打印文件内容 download # 下载一个文件 http start # Start's an HTTP server in the current working directory status # Get the status of the HTTP server stop # Stop's a running HTTP server upload # 上传一个文件frida # 获取对于 frida 环境的信息import # 从残缺门路导入 frida 脚本并运行ios 执行指定的 ios 命令 bundles cookies heap hooking info jailbreak keychain monitor nsurlcredentialstorage nsuserdefaults pasteboard plist sslpinning uijobs kill # 完结一个工作。这个操作不会写在卸载或者退出以后脚本 list # 列出以后所有的工作ls # 列出当前工作目录下的文件memory dump all 文件名 # Dump 以后过程的整个内存 from_base 起始地址 字节数 文件 # 将(x)个字节的内存从基址转储到文件 list exports # List the exports of a module. (列出模块的导出) modules # List loaded modules in the current process. (列出以后过程中已加载的模块) search # 搜寻模块。用法:memory search "<pattern eg: 41 41 41 ?? 41>" (--string) (--offsets-only) write # 将原始字节写入内存地址。小心应用!ping # ping agentplugin load # 载入插接pwd # 打印当前工作目录reconnect # 从新连贯 devicerm # 从 device 上删除文件 sqlite # sqlite 数据库命令 connect # 连贯到SQLite数据库文件ui alert # 显示警报音讯,可选地指定要显示的音讯。(目前iOS解体)

December 22, 2022 · 3 min · jiezi

关于python:加载速度提升-15关于-Python-启动加速探索与实践的解析-龙蜥技术

编者按:在刚刚完结的 PyCon China 2022 大会上,龙蜥社区开发者严懿宸分享了主题为《Python 启动减速的摸索与实际》的技术演讲。本次演讲,作者将从 CPython 社区相干工作、本计划的设计及实现,以及业务层面的集成等方面进行介绍。 以下为本次演讲内容: 一、Python 启动速度简析首先从一个 Python 3 中空解释器启动工夫的坏事剖析开始。咱们能够看到,次要的耗时都和 Python 包加载无关。 其中,CPU 工夫中包加载占据了 30% 左右的工夫;而 37% 的等待时间中,磁盘 IO 等破费的工夫也和包加载有较大的关联。 相熟 Python 机制的敌人大略晓得,Python 中加载一个包首先会搜寻对应的 pyc 文件,这是一种序列化的字节码格局。找到之后会对其进行反序列化,并执行其中的代码。如对应的 pyc 文件不存在,会从新编译 py 文件失去字节码,并序列化为 pyc 文件长久化保留。咱们优化的次要指标次要集中在加载包这个过程,心愿可能至多免去每次查找、读取、反序列化的开销。 以 Python3.10 为例,这里是应用 python 解释器启动一个空语句的所需工夫,同时应用了 -Ximporttime 打印出过程中加载每一个包的耗时。能够粗略地看到,包加载工夫大概占了总工夫的 30% 左右。咱们发现这种状况和 Java 虚拟机相似。在 Java 中,Java 会首先将 Java 源代码编译为 Java 字节码,随后由 Java 命令执行。 咱们晓得 Java 的劣势并不包含启动速度,这种流程也是起因之一。那么 Java 如何局部解决这个问题呢? 二、PyCDS (代码对象共享)设计与实现 Java 中有一个叫做 CDS/AppCDS 的机制,通过将 Java 字节码和一些辅助数据长久化保留,在后续启动时应用 mmap 加载,节约了磁盘 IO 和解析验证 class 文件的开销。 ...

December 22, 2022 · 1 min · jiezi

关于python:oeasypython0031挂起进程恢复进程进程切换

查看过程回顾上次内容上次批改了 $PATH 门路 把以后用户shiyanlou的宿主文件夹 ~ 增加到 $PATH 中这样 sleep.py 就能够被找到于是就能够被执行了还能够把配置 $PATH 的脚本 放到 zsh的配置文件(~/.zshrc) 中配置 ~/.zshrc 就能够 设置 zsh 环境下默认的 $PATH在以后门路运行 sleep.py 在 python 程序第 1 行 申明打开方式为 python3把 /usr/bin/python3 从硬盘调用到内存 成为一个过程 一直输入工夫ctrl+c完结过程 我想看到 python3 这个过程 可能吗?进行搜寻如果我想查看过程 也须要运行相应的过程查看命令ps然而如果 sleep.py 继续输入工夫我是没有方法运行ps命令的 我须要把 sleep.py 转到后盾运行 而后查问过程信息切到后盾切换的办法比较简单 ctrl + z 把以后过程 从 前台切换到 后盾并暂停简略来说就是不给他用cpu了suspended(挂起了) 能够把后盾过程切换回前台吗?前后台切换所谓把 过程 切换到后盾 就是进行一直把工夫输入到规范输入流 sleep.py这个过程从前台切换到后盾并暂停而且把控制权交回给shell 能够持续输出命令了那是否反过来? 把过程从 后盾(background)切换到 前台 (foreground)呢? fg 怎么了解fg呢?fgforeground的意思就是 离观察者更近的前景 fore的意思是后面的 before 在后面的first 最后面的第一个former 已经的forth 向前forward 向后退far 后退的太多了就远了further 比远还要进一步的象声词词根来自*per*per象声词 ...

December 21, 2022 · 1 min · jiezi

关于python:验证码逆向专栏某片滑块点选验证码逆向分析

申明本文章中所有内容仅供学习交换应用,不用于其余任何目标,不提供残缺代码,抓包内容、敏感网址、数据接口等均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关! 本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】分割作者立刻删除! 逆向指标指标:某片的滑动验证码和点选验证码逆向主页:aHR0cHM6Ly93d3cueXVucGlhbi5jb20vcHJvZHVjdC9jYXB0Y2hh 抓包剖析验证码图片获取接口,GET 申请,蕴含四个参数:cb、i、k、captchaId,有时候可能也会有 token 参数,那是因为不是第一次加载图片,比方刷新图片,会将之前接口的 token 值带上。 接口返回,如果是滑动验证码,则 bg 是背景图,front 是滑块图,还有个 token 值后续会用到。 如果是点选验证码,则 captchaImage 是底图,wordsImage 是须要点击的文字,同样的有个 token 值后续会用到。 验证接口,蕴含五个参数:cb、i、k、token、captchaId,其中 token 就是获取验证码接口返回的。 逆向剖析图片接口先来看看获取验证码图片的接口,全局搜寻关键字 captchaId 即可定位到 key 为 jsonpRequest 的中央,下图中的 t 就是残缺的接口 URL 了: 往上挨个找,先看看 captchaId,其实就是 this.APP_ID,屡次刷新你会发现,对于滑块来讲,是定值 974cd565f11545b6a5006d10dc324281,对于点选来讲,是定值 e1e7be036f9242c7aed023438af66f46,这两个值在一个 JS 里是写死的,如下图所示: 再往上看,HOSTS 啥的是定值就不用说了,cb 就是 r,i 就是 a.i,k 就是 a.k,通过 concat() 办法连接起来,所以只须要搞定 r 和 a 的值就行了,如下图所示: a 的值是通过 encrypt(e) 失去的,e 外面有 fp、address、yp_riddler_id 等值,如下图所示: ...

December 20, 2022 · 1 min · jiezi

关于python:Python-为什么如此设计

大略两年半前,我萌发了要创作一个新的系列文章的想法,也就是“Python为什么”,试图对 Python 的语法及个性提出“为什么”式的问题,以此加深对它的了解,探寻应用技巧、倒退演变、设计哲学等话题。 始终以来,我都是一个有着较强问题意识的充斥着好奇心的人,擅长于辨认出类似货色的差别,并从差异性上发现事物的独特意义。 于是,当将 Python 与其它编程语言作比拟时,加上浏览及翻译了一些 PEP 从而积攒了一些素材后,我就失去了很多的小发现。当确认了国内外的技术社区里短少这方面的文章后,我就更确信了这件事的独特价值。 我过后有个天真的想法,感觉能够依照“十万个为什么”的形式,写出源源不断的文章…… 刚开始的 2020 年下半年,我创作力旺盛,写了约 20 篇“Python为什么”系列文章!然而,到了 2021 年,仅有 2 篇!再到 2022 年,也是仅仅 2 篇!!…… 工夫都去哪儿了?怎么我才稍略微偷了个懒儿,它就不见了呢?原本打算有不少想写的话题的,怎么拖着拖着就忘了该怎么写了呢…… 最近眼看到了年末,我越想越是有些不甘,于是,花了几天工夫,好好梳理了下“Python为什么”系列文章,优化了 Github 的介绍内容,筹备认真把这个系列重拾起来! 我把之前考察问卷里遗留的问题,以及其它打算要写的话题放在 Issues 跟踪,欢送大家来提问题/给倡议/领导写作/监督催更…… 上面放出的是目前系列文章的介绍,恳请喜爱本系列的同学给颗 star 激励一下!(内容会不断更新/增长,请以 Github 主页为准。) 如果你在手机微信端浏览,因为链接跳转麻烦,倡议你通过这个合集的链接进行浏览。文章列表Python 设计和历史的常见问题 Python 官网提供了约 30 个常见问题的 FAQ,你能够从中疾速失去“权威”的解释Python 为什么用 len() 函数,不必 x.len() 格调?-and-not-x.len().md) 介绍了《晦涩的Python》及 Guido 的解释我自己认为这体现了 Python 对世界实质的洞察文章顺便答复了:为什么 Python 的索引从 0 开始计数?Python 为什么应用缩进来划分代码块? 这是个经典的问题,总会被提起,我总结了 8 个起因有不少人对上述 8 个起因并不买账,因而我补充了一个回复:Python 的缩进绝不是反人类的设计!Guido 在一次采访中说:严格要求代码缩进的确有点夸大,改用花括号,也不是不能够Python 的缩进起源于 ABC,而 ABC 的缩进起源于 60-70 年代的编程畅想Python 为什么不必分号作语句终止符? ...

December 18, 2022 · 2 min · jiezi

关于python:oeasypython0030设置路径exportPATHzsh系统路径设置export

放入门路回顾上次内容咱们要在任意门路下间接执行 sleep.py 把 sleep.py 放在 /usr/bin/ 上面最终能够在任意地位执行程序sleep.py然而 /usr/bin 外面放的个别都是二进制命令文件命令切实是太多太乱最终还是删除了sleep.py我想 把宿主目录增加到零碎变量 $PATH 中 这样有可能吗?先回顾 为什么无论以后门路在哪里ls都能执行门路 ls所在的门路是/usr/bin 是在零碎变量$PATH中的#!/usr/bin/python3import timewhile True: print(time.asctime()) time.sleep(1)当初只有把sleep.py 所在的文件夹目录 /home/shiyanlou也放到$PATH中就能够随地调用其中的sleep.py了批改 PATH #查看以后$PATHecho $PATH#设置$PATH,留神不要加空格export PATH=~:$PATH#查看更新后的$PATHecho $PATHexport PATH=~:$PATH 后面的 PATH 不须要$~是以后用户 shiyanlou 的用户文件夹 也就是/home/shiyanlou:是分隔符号具体成果留神!!! PATH必须大写 $PATH和$path是两回事输出的时候千万留神不能应用中文标点!!! 包含:~都必须是英文半角 批改后次要是 在老$PATH(黄色)之后减少了~(红色) 以后用户文件夹(~)也就是shiyanlou的用户文件夹/home/shiyanlou减少后的后果就是新$PATH 就在蓝色方框内/home/shiyanlou 下有 sleep.py 这回能运行么尝试运行原来基本找不到的sleep.py 当初说的是权限不够 阐明能够找到了尽管因为权限问题不能运行这阐明 shiyanlou的宿主目录曾经进入零碎门路$PATH了只是权限不够还是须要给以后用户执行权限 chmod u+x sleep.py sleep.py的owner是shiyanloushiyanlou就是以后用户给以后用户减少执行权限(execute)而后再尝试运行python.py胜利运行 sleep.py的确间接运行了! 换个门路也能够么?执行过程换个门路也能找到sleep.py 在内存中运行的python3 解释执行 sleep.py每隔 1s 输入一次工夫ctrl+c完结过程然而敞开以后终端从新关上新的 xfce终端 这个新$PATH就生效了sleep.py也找不到了 这可怎么办呢?重启终端过程新开一个终端之后 $PATH 就回到了最后 不蕴含/home/shiyanlou了找不到 sleep.py 了我心愿每次新关上 terminal 就主动把 $PATH 设置好应该怎么办?终端初始化钻研一下终端的初始化过程当咱们运行某个shell文件的时候 ...

December 17, 2022 · 1 min · jiezi

关于python:Python写个点球大战小游戏

大家好,欢送来到 Crossin的编程教室 ! 看过我Python入门教程的敌人应该会看到其中有提到一个点球小游戏的作业。在世界杯决赛行将到来之际,咱们再来回顾一下这个小游戏。对于刚刚学习编程不久的同学,这是个不错的练手习题,能够尝试本人写一写。 https://www.bilibili.com/vide... 先说下题目: 首先这个游戏的外围,就是判断玩家和电脑抉择的方向是不是一样。 玩家的抉择通过input输出获取,电脑的抉择咱们能够用random随机数模块来产生要 留神的点在于两种后果的类型要统一,不然怎么比都是不相等。 import randomyou = int(input('玩家罚球,请抉择射门方向 (1)左 (2)中 (3)右:'))com = random.randint(1, 3)print('电脑抉择了', com)if you != com:print('球进了!')else:print('球没进')每一轮,玩家踢完电脑踢,所以这段代码要再来一遍。或者咱们能够借助于列表和循环来复用代码。import randomkicker = ['玩家', '电脑']action = ['射门', '扑救']for i in range(2): you = int(input(f'{kicker[i]}罚球,请玩家抉择{action[i]}方向 (1)左 (2)中 (3)右:')) com = random.randint(1, 3) print('电脑抉择了', com) if you != com: print('球进了!') else: print('球没进')踢5轮就是在里面加一层5次的循环。能够抉择把这段代码封装成函数,让代码构造更清晰。 另外,再记录一下分数。同样是用一个列表变量来记录单方的得分,谁踢进了,就给谁加1分。 import randomkicker = ['玩家', '电脑']action = ['射门', '扑救']score = [0, 0]def kick(): for i in range(2): you = int(input(f'{kicker[i]}罚球,请玩家抉择{action[i]}方向 (1)左 (2)中 (3)右:')) com = random.randint(1, 3) print('电脑抉择了', com) if you != com: print('球进了!') score[i] += 1 else: print('球没进') print(f'比分 {score[0]} : {score[1]}')for n in range(5): print(f'======== 第{n+1}轮 ========') kick()对于5轮踢完是平局的状况解决,能够再加个while循环,只有单方分数相等,就持续踢下去。 ...

December 17, 2022 · 2 min · jiezi

关于python:python-kubernetes-获取-pod-的-cpu-占用率

这个教程是应用 kubernetes 的 python client sdk 获取 pod 的 cpu 占用率,而不是通过 kubectl 命令!kubernetes python client sdk 动机我要做什么? 最近有一个 pod ,是 rabbitmq 的消费者,然而会呈现频繁卡死的状况,所以我须要判断 pod 是不是卡死了,而后重启。 这个判断没有方法通过个别的健康检查发现 判断根据:CPU 应用配额低于20m就认定为卡死,就删除 pod(删除 pod 之后,k8s 会从新一个新的) 技术计划计划一:应用 shell+kubectl。然而我不喜爱 shell,也不喜爱解析非结构化的输入,所以这个计划就淘汰了 计划二:应用 python + kubernetes sdk。我喜爱 python,而且这样能够输入结构化的数据结构,比方 json,不便我解析,good 所以,我才用计划二! 获取一个『命名空间』下的所有 pod首先,咱们要列出一个 namespace 上面所有的 pod 相似 kubectl get pod -n vddb vddb 是 namespace 的 namefrom kubernetes.client.models.v1_pod import V1Podfrom kubernetes.client.models.v1_pod_list import V1PodListfrom kubernetes.client.models.v1_object_meta import V1ObjectMetafrom kubernetes import client, configfrom kubernetes.client import ApiClientfrom kubernetes.client.rest import RESTResponsefrom loguru import loggerconfig.load_kube_config()v1 = client.CoreV1Api()namespaced_name = 'vddb'pod_list: V1PodList = v1.list_namespaced_pod(namespaced_name)for pod in pod_list.items: pod: V1Pod metadata: V1ObjectMeta = pod.metadata pod_name = metadata.name获取一个 pod 的 metrics列出了 pod name 之后,咱们就是获取 pod 的对应的 metrics,比方应用的 CPU、内存配额 ...

December 16, 2022 · 2 min · jiezi

关于python:深入理解-Python-的对象拷贝和内存布局

深刻了解 Python 的对象拷贝和内存布局前言在本篇文章当中次要给大家介绍 python 当中的拷贝问题,话不多说咱们间接看代码,你晓得上面一些程序片段的输入后果吗? a = [1, 2, 3, 4]b = aprint(f"{a = } \t|\t {b = }")a[0] = 100print(f"{a = } \t|\t {b = }")a = [1, 2, 3, 4]b = a.copy()print(f"{a = } \t|\t {b = }")a[0] = 100print(f"{a = } \t|\t {b = }")a = [[1, 2, 3], 2, 3, 4]b = a.copy()print(f"{a = } \t|\t {b = }")a[0][0] = 100print(f"{a = } \t|\t {b = }")a = [[1, 2, 3], 2, 3, 4]b = copy.copy(a)print(f"{a = } \t|\t {b = }")a[0][0] = 100print(f"{a = } \t|\t {b = }")a = [[1, 2, 3], 2, 3, 4]b = copy.deepcopy(a)print(f"{a = } \t|\t {b = }")a[0][0] = 100print(f"{a = } \t|\t {b = }")在本篇文章当中咱们将对下面的程序进行具体的剖析。 ...

December 16, 2022 · 6 min · jiezi

关于python:精彩剧透PyCon-China-2022-邀您共赴技术-Party

PyCon ChinaPyCon China 每年由 PyChina 社区定期举办,现如今已成为中国大型的 Python 技术会议。咱们心愿汇聚更多的开发者们,一起交换 Python 技术,包含人工智能、Python 个性、网络安全、服务端开发、运维、医疗、金融、开源我的项目等更多 Python 相干的技术畛域。 PyCon China 2022往年是 PyCon China 的第十二个年头,咱们将判若两人为大家提供一个展示自我,也聆听别人的舞台,让大家能在这里纵情地享受 Python 带来的乐趣。 PyCon China 2022 持续采纳线上➕线下相结合的模式举办,咱们将在北京举办线上分会场,同时上海/深圳/杭州三个城市举办线下会场,直播为大家提供线下、线上面对面的交换机会。 大会工夫:2022年12月17日大会模式:线下相聚、线上直播线下城市:上海、深圳、杭州线上城市:北京 扫码报名 嘉宾阵容剧透大会正在紧锣密鼓的筹备中往年有什么陈腐的玩法和惊喜呢?PyCon China 2022 提前剧透来啦!!!!! 咱们邀请了互联网大厂的技术专家Python畛域沉闷的搭档别离在线下上海/深圳/杭州站线上北京站为咱们带来精彩的分享盛宴 主会场 更多神秘嘉宾敬请期待 上海站流动报名:线下参会:http://hdxu.cn/fMxVb线上参会:http://hdxu.cn/fn0z1 闪电演讲 杭州站流动报名:线下参会:http://hdxu.cn/52bJH线上参会:http://hdxu.cn/7cxLP 闪电演讲 深圳站流动报名:线下参会:http://hdxu.cn/8c4nd线上参会:http://hdxu.cn/52VeE 闪电演讲 北京站流动报名:线上参会:http://hdxu.cn/RYxNJ 后续将为大家具体介绍每个城市站对应的嘉宾阵容 非常感谢各位的反对与资助合作伙伴继续招募中~ 观看直播链接:https://segmentfault.com/area...

December 16, 2022 · 1 min · jiezi

关于python:Django-简介

Django简介Django 是 Python 语言的 Web 框架,开源且收费,能够用于满足疾速开发网站的需要。 Django 接管了 Web 开发过程中的方方面面,所以开发者能够专一于编写应用程序,而不须要从新造轮子。 Django 的特点: 十分快 Django 的设计就是为了帮忙开发者疾速开发网站。 功能丰富 Django 能解决 Web 开发过程中常见的工作需要,包含用户认证,内容治理,网站地图,RSS 订阅等开箱即用性能。 平安 Django 能防止很多平安问题,例如:SQL 注入,跨站点脚本,跨站申请伪造和点击注入等。 反对大规模网站 如:Instagram,Mozilla 多样化 公司、组织、政府都是用 Django。 创立我的项目django-admin startproject mysite应用上述命令创立一个 Django 我的项目。 文件构造: mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py这些文件: manage.py:命令行工具用于和我的项目进行交互内部 mysite:是文件的根目录,也是我的项目的容器,文件夹名能够更改外部 mysite:ORMORM 即 object-relational mapper 对象关系映射。 应用 Python 定义数据模型,Django 提供丰盛的数据库 API,也能够本人编写 SQL。 示例代码: class Band(models.Model): name = models.CharField(max_length=200) can_rock = models.BooleanField(default=True) class Member(models.Model): name = models.CharField("Member's name", max_length=200) instrument = models.CharField(choices=( ('g', "Guitar"), ('b', "Bass"), ('d', "Drums"), ), max_length=1 ) band = models.ForeignKey("Band")URL 和视图Django 组织的 URL 都很参差。 ...

December 16, 2022 · 2 min · jiezi

关于python:Python编程从入门到实践第2版读后感

其实,在浏览这本书之前,我曾经对python的根底语法有所理解,然而对于如何用 python 去创立一个我的项目并不分明。所以我的浏览重点次要放在了第二局部,对第一局部只是大体的浏览了一下。 当我浏览第一局部的时候,会让我想起初学python时遇到的一些坑。在这本书中竟都一一指明了,如果我刚开始学习python的时候,就晓得这本书该多好。 在刚开始装置的时候,肯定要记住将装置门路退出到环境变量中,否则你在终端窗口中执行python命令时它会报错。在学习python之前,我曾经上完了C语言的课程,再学习python时感觉非常简单。仅仅只须要几行就能实现令人诧异的成果,但有时也会被变量之间的赋值给绕晕了,就像被C语言的指针给绕晕似的。这到底是浅拷贝呢?还是深拷贝呢?当我把一个变量赋值给另一个变量的时候,扭转其中一个变量的值会不会影响另一个变量的值呢?在本书中,将变量形容为指向值的标签,让读者更容易的了解了python变量的行为。这一部分内容也是在第二版中新增加的,可见这本书的内容也始终一直地在进步和改良。这本书简直笼罩了python的所有根底语法内容,能够让你一窥python的整个面目。以前加入数学建模的时候,我就试着用Python来解决数据,写好程序之后,就等着出后果了。因为数据量有点大,有时要半个小时或者更多,但最蹩脚的是,当遇到异样的数据(比方,空的数据)时,程序会异样终止,之前所计算的数据也都没有了。因为我没有意识到要进行异样解决,我也不晓得啥是异样解决。起初,通过上网搜寻才晓得了要用异样解决来解决这个问题,既不会因为异样数据而终止,同时还发现了异样数据的具体位置。当然,咱们也能够不须要异样解决,先写个程序去掉异样数据,再解决也是能够的,但相比前一种办法不够简洁,也不够强壮。如果我早读了这本书,可能就不用浪费那些工夫了,小心翼翼的等着程序的执行了,惟恐一个谬误断送了我之前已计算好的数据。第二局部就没有那么容易去浏览了。我并没有做我的项目的任何教训,只是写过几行或几十行的小程序,而在我的项目中要波及很多的文件,而且它们之间还互有关系。第二局部的三个我的项目依据难度排序,数据可视化 < 外星人入侵 < web 应用程序。 数据可视化局部次要是利用了matplotlib和plotly这两个库对一些天气和地震数据进行了可视化剖析。其中也介绍了如何对csv文件和json文件进行解析,介绍了很多绘图函数的用法,用途还是很大的。最令我诧异的的是,竟然能够绘制一张地图,并在下面依据经纬度坐标描点绘制散点图或折线图。而且还能够生成一个html文件,且能够进行交互操作。以前加入泰迪杯数据挖掘较量的时候,就遇到一个题,须要在地图上画出车辆的行驶轨迹。在网上找了良久,才找到了个较为称心的计划。如果我早看到这本书,就不须要破费那么多工夫了。外星人入侵应用pygame来实现一个小游戏,麻雀虽小,但五脏俱全。作者先实现了游戏的一部分,刚开始只有太空飞船,起初又增加了外星人。在较为残缺的状况下,又增加了积分零碎、等级零碎等。使得它变成了咱们看到的那种太空大战游戏。尽管是应用pygame来实现的,然而应用pygame接口的时候并不多,大多数是用了Python的一些根底语法常识,应用到的pygame接口也较为容易了解,所以这个我的项目了解起来不算难,且充沛锤炼了在第一局部学到的Python基础知识。最难的我的项目当属web应用程序了,它是利用django搭建了一个学习记录平台,就像是博客那样。和外星人入侵我的项目相比,这个我的项目须要用到的库的接口要多的多,波及到的文件也要多,层次结构也更明显,更像是一个实在的我的项目。仅仅通过两章的内容就把django解说分明,那是不可能的。然而能够让咱们理解如何应用django开发一个web利用的大抵流程以及我的项目如何部署在服务器上。这本书只是一本入门书,还有一些更高级的内容在本书中并没有波及,如装璜器、闭包、如何编写能力进步python的效率等。对于如何开发一个python我的项目,这本书只是带咱们入了门,还有更多的内容须要咱们从其余中央去学习。正如作者在后记中所说的那样“深刻学习Python后再去开发我的项目时,你将可能更高效地解决更多的问题”。对于想入门python或入门python我的项目的人来说,这的确是一本绝佳的好书。

December 16, 2022 · 1 min · jiezi

关于python:最好的Python入门书籍Python编程从入门到实践

Python的入门很简略,网上有很多材料,但他们大部分都集中在Python语言的用法上,加上学习一些脚本写法,对语法思维和设计理念都是泛泛而谈,所以只管有所实际,然而无奈由浅入深去论述一个概念,总是停留在外表的“摄取”,而像这本图灵出版社出的《Python编程:从入门到实际》,能够从浅入深,从理念到使用,再到思考,是十分值得举荐的Python入门教材,价格也很适合。对于Python这门语言而言,总是游刃有余。它很轻,但不代表着达到python高手的路很轻松。如果没有打牢语法的根底,不可能深刻理解语言设计的整套理念,从能用到会用,要绕很多路。在从会用到bug free,到达到python高性能,要付出很多额定的致力。而熟读《python编程》编程这本书能帮你最快最无效的达到你的学习指标,成是为构建你的Python世界的基石。我的Python学习就是从《Python编程:从入门到实际》开始,到起初始终都是在图灵家买书,从《Python + Excel,飞速搞定数据分析与解决》,到《Python网络爬虫开发实战》,再到《Python数据迷信手册》,这些书也值得举荐,它们是各自方向的根底书籍,很适宜在Python入门之后进行深刻。爬虫,办公自动化,机器学习,后端编程,在Python沉闷的方向都有涉猎。残缺的Python学习应该从,书本到代码,再到笔记,最初又成为代码,在实践中学习,在学习中实际。《Python编程:从入门到实际》会是你成为Python高手的第一站。

December 15, 2022 · 1 min · jiezi

关于python:制作-Python-Docker-镜像的最佳实践

概述️Reference: 制作容器镜像的最佳实际 这篇文章是对于制作 Python Docker 容器镜像的最佳实际。(2022 年 12 月更新)最佳实际的目标一方面是为了减小镜像体积,晋升 DevOps 效率,另一方面是为了进步安全性。心愿对各位有所帮忙。 通用 Docker 容器镜像最佳实际这里也再次列举一下对 Python Docker 镜像也实用的一些通用最佳实际。 应用 LABEL maintainer标记重要端口设置环境变量应用非 root 用户运行容器过程应用 .dockerignore 排除无关文件Python 镜像举荐设置的环境变量Python 中举荐的常见环境变量如下: # 设置环境变量ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1ENV PYTHONDONTWRITEBYTECODE 1: 倡议构建 Docker 镜像时始终为 1, 避免 python 将 pyc 文件写入硬盘ENV PYTHONUNBUFFERED 1: 倡议构建 Docker 镜像时始终为 1, 避免 python 缓冲 (buffering) stdout 和 stderr, 以便更容易地进行容器日志记录❌不再倡议应用 ENV DEBUG 0 环境变量,没必要。应用非 root 用户运行容器过程出于平安思考,举荐运行 Python 程序前,创立 非 root 用户并切换到该用户。 ...

December 15, 2022 · 3 min · jiezi

关于python:oeasypython0022-python虚拟机反编译cpu架构二进制字节码汇编语言

程序实质回顾上次内容python3 的程序是一个 5.3M 的可执行文件 咱们通过which命令找到这个python3.8的地位将这个python3.8复制到咱们的用户目录下这个文件还是可能执行的将这个文件转化为字节状态 的确能够转化然而这个文件咱们看不懂啊!!! 怎么才能看懂这些货色呢? 这个货色咱们的确看不懂然而有人能看懂 谁呢?实在的cpu无论手机还是计算机 最外围器件的器件就是cpu 这个货色是个实实在在存在的实体这个cpu就能看懂这些字节码吗?cpucpu能看懂这些字节码!!!这些字节码 咱们看不懂的cpu能看懂这是属于cpu的机器语言这就是cpu的一条条的机器指令(instruction) 机器指令码都是二进制字节模式的 咱们尝试把python3.8转化为字节表现形式反汇编-汇编语言助记符#先把~/python3对应的机器语言输入为汇编指令模式(反汇编)objdump -d python3.8 > python3.8.asmvi python3.8.asm这次真的能够看懂了 减法(sub)挪动(mov)这些指令 能够发现以后零碎的架构(指令集)是x86-64这些和咱们方才的字节状态有关系吗?比照用vi分窗口别离关上关上python3 和 python3.asmvi -o python3.8hex python3.8.asm下图中上半局部是机器语言 上图下半局部是机器语言对应的汇编指令助记符ctrl+j、ctrl+k能够高低窗口切换咱们来试着找找 python3.8文件中机器语言的0101和cpu的汇编指令的对应关系找到了上面窗格 先跳到第8行endbr64 意味着 64位完结分支上面就是第9行 第9行 /48 83 找到高低的对应关系也就是第一条执行的汇编指令subsub对应substract 是减法汇编指令是计算机 cpu 机器指令的助记符查找对应关系423000 就是初始化(init)的 cpu 开始执行指令的地址咱们在下面查找48 83 看有没有对应的字节/4883 ec08 488b...在下面的窗格中搜寻这些字节状态 如同找到了对应关系 具体怎么对应的呢?这台计算机用的是什么指令集呢?什么是指令集来着?指令集指令集就是指令的汇合 指令集也叫计算机的架构不同架构的 cpu 有不同的指令集 咱们目前的这个浏览器外面的零碎用的是 x86-64除此之外 arm、MIPS、RISC-V 也是罕用的指令集指令助记符和机器语言到底是则怎么对应的呢?回到代码代码会有不同的 section 模块 入口是 init作用是初始化initialization 模块外面是具体的指令 比方第一句 48 83 ec 08为什么48 83 就能够代表减法这是谁规定的呢?查看指令集这是cpu架构规定的 首先要明确到以后机器的cpu的架构反汇编外面说是x86-64 到shell外面验证一下 以后机器所用的架构指令集的确是x86-64这是谁的架构呢?搜寻不会了就去搜寻 ...

November 29, 2022 · 1 min · jiezi

关于python:技术解读倚天-ECS-实例-Arm-芯片的-PythonAI-算力优化

深度学习技术在图像识别、搜寻举荐等畛域失去了广泛应用。近年来各大 CPU 厂商也逐步把 AI 算力纳入了重点倒退方向,通过《Arm 芯片 Python-AI 算力优化》咱们将看到龙蜥社区 Arm 架构 SIG(Special Interest Group) 利用最新的 Arm 指令集优化 Python-AI 推理 workload 的性能。 倚天ECS实例的AI推理软件优化阿里云推出的倚天Arm ECS实例,领有针对AI场景的推理减速能力,咱们将理解减速的原理以及以及相干的软件生态适配。 卷积神经网络(CNN)在图像和语音畛域应用宽泛,神经网络算法相比传统的算法耗费了更多算力。为了摸索对计算的优化,咱们进一步看到AlexNet模型(一种CNN)的推理过程的各个层的计算资源耗费占比。 能够看到名为conv[1-5]的5个卷积层耗费了90%的计算资源,因而优化CNN推理的要害就是优化卷积层的计算。 咱们进一步来看如何对图像利用卷积核: 1.应用im2col依据卷积核尺寸,将图像转化为若干块(patch)2.将多个卷积核开展成若干向量3.对由图像块组成的矩阵和由多个卷积核开展组成的矩阵利用矩阵乘法 下面一页的计算利用了矩阵乘法操作,为什么咱们不采纳更加间接的迭代计算形式,而是采纳须要额定内存的矩阵乘法呢?这里有两个关键因素: 深度学习的卷积计算量很大,典型计算须要波及5000万次乘法和加法操作,因而对计算的优化非常重要计算机科学家们曾经深刻摸索了矩阵乘法操作,矩阵乘法操作能够被优化得十分快。在fortran世界中,GEMM(general matrix multiplication)曾经成为一个通用操作:该操作通过对数据重新排列,精心设计计算过程,利用多线程和向量指令,能够比本人实现的奢侈版本快十倍以上。因而应用矩阵运算带来的收益相比额定的开销是值得的。 因为AI推理大量应用了矩阵乘法,现在也有许多硬件对矩阵运算进行了减速: NVIDIA Volta架构引入了tensor core,能够高效地以混合精度解决矩阵乘Intel AMX(Advanced Matrix Extensions) 通过脉动阵列在硬件层面反对矩阵乘ARM SME(Scalable Matrix Extension) 反对向量外积运算,减速矩阵乘尽管在AI算力上GPU要远高于CPU,然而CPU因为其部署不便,且无需在主机-设施间拷贝内存,在AI推理场景占有一席之地。目前市面上尚没有能够大规模应用的反对AMX或者SME的硬件,在这个阶段咱们应该如何优化CPU上的AI推理算力呢?咱们首先要理解BF16数据类型。 BF16(Brain Float 16)是由Google Brain 开发设计的16位浮点数格局。相比传统的IEEE16位浮点数,BF16领有和IEEE单精度浮点数(FP32)一样的取值范畴,然而精度较差。钻研人员发现,在AI训练和推理中,应用BF16能够节约一半的内存,取得和单精度浮点数靠近的准确率。 依据右图,BF16指数的位数和FP32是统一的,因而BF16和FP32的互相转换只有截断尾数即可,左下角图上便是tensorflow源码中的转换实现。 引入BF16的一大价值是现在的很多硬件计算的瓶颈在寄存器宽度或者拜访内存的速度上,更紧凑的内存示意往往能够取得更高的计算吞吐,在现实状况下,BF16相比FP32能够进步一倍的吞吐(FLOPS)。 现在咱们尽管无奈大规模应用到反对AMX/SME的硬件,然而Armv8.6-A提供了bf16扩大,该扩大利用了无限的128bit向量寄存器,通过BFMMLA指令执行矩阵乘法运算: 输出A: 大小为2*4的BF16矩阵,按行存储输出B: 大小为4*2的BF16矩阵,按列存储输入C: 大小为2*2的FP32矩阵该指令单次执行进行了16次浮点数乘法和16次浮点数加法运算,计算吞吐十分高。 阿里巴巴向OpenBLAS我的项目奉献了sbgemm(s示意返回单精度,b示意输出bf16)的硬件加速实现,从GEMM吞吐上看,BF16相比FP32 GEMM吞吐晋升超过100%。 倚天ECS实例是市面上多数能够反对bf16指令扩大的ARM服务器。目前曾经反对了Tensorflow和Pytorch两种框架的AI推理 Tensorflow下能够通过OneDNN + ACL(Arm Compute Library)来应用BFMMLA加Pytorch曾经反对了OneDNN + ACL,然而目前还在试验状态,无奈很好地施展性能。然而Pytorch同时反对OpenBLAS作为其计算后端,因而能够通过OpenBLAS来享受ARM bf16扩大带来的性能收益 ...

November 29, 2022 · 1 min · jiezi

关于python:dgiot通过grpc调用python算法库

grpc介绍gRPC是一个高性能,开源和通用的RPC框架,基于Protobuf序列化协定开发,且反对泛滥开发语言。gRPC基于以下理念:定义一个服务,指定其可能被近程调用的办法(蕴含参数和返回类型)。在服务端实现这个接口。并运行一个gRPC服务器来解决客户端调用。在客户端领有一个存根可能向服务端一样的办法。 dgiot_grpc_python连贯 Dgiot客户端dgiot通过grpc与其余语言互相通信以及函数调用。在dgiot中,以一个grpc通道解决所有交互。而grpc相干函数定义在dgiot_dlink下,分为login,logout,send三个函数。 loginlogin函数用于登录grpc服务端,其参数为ClinetId,为客户端编号。建设grpc通道后,将会在通道启动时以通道id为ClinetId登录python服务器。 sendsend函数用于向python客户端发送音讯。send函数位于通道的handle_message函数中。在通道接管到音讯,并且匹配上Message中内容后即可依据音讯内容执行send函数调用python服务。send函数以map的格局发送音讯,音讯在发送前将通过base64编码。 logoutlogout函数用于断开与python服务的连贯,个别在通道的敞开函数stop中调用。 Python 程序文件python程序示例位于apps\dgiot_dlink\priv\example\python3目录下,其目录构造如下:运行dlink_server文件即可启动python服务,接管信息函数位于Dlink类下SayHello办法。其接管request和context两个参数,参数含意如下: request:接管参数,request下name属性为接管到的信息。context:接管参数,以后的环境通过对request.name应用base64解码并转为字典后即可获取本来的信息。接管参数后通过HelloReply的message字段返回一条信息:残缺交互后果如下图:

November 28, 2022 · 1 min · jiezi

关于python:milvus-异常无法连接

milvus 忽然连贯不上了 (UNKNOWN) [127.0.0.1] 19530 (?) : Connection refusedroot@svddb:~# nc -zv 127.0.0.1 19530localhost [127.0.0.1] 19530 (?) : Connection refusedroot@svddb:~# nc -zv 127.0.0.1 8000localhost [127.0.0.1] 8000 (?) open周末的时候跑的好好的,明天一看,客户端连贯不上了,我就登上部署 milvus 的机器,应用 nc 命令试了试,后果:端口回绝 用 docker ps -a 看容器状态一切正常 用 docker logs -n 100 milvus-standalone 看 milvus 的日志,好多,不想看 关上 attu,发现 attu 也连贯不到 milvus 产生的起因是什么呢?milvus 的 bug 吗? 我也不晓得,所以我抉择重启 milvus 试试,而后看到了上面的输入,大略明确了,是磁盘满了 root@svddb:/opt/milvus# docker-compose restart Restarting milvus-standalone ... errorRestarting milvus-etcd ... doneRestarting zilliz_attu ... doneRestarting milvus-minio ... doneERROR: for milvus-standalone Cannot restart container 14dfffec1689ed17de43fa0551d3ea2284fc238fa4ff8ad5911fa94e06a30c6d: mkdir /var/lib/docker/overlay2/0653e1c8fed616fff53b215d6a8c09ebdf1a22732a4121750326c94168a653e2/merged: no space left on device而后应用 df 命令看看,的确,40GB 都满了 ...

November 28, 2022 · 1 min · jiezi

关于python:label-studio-结合-MMDetection-实现数据集自动标记模型迭代训练的闭环

前言一个 AI 方向的敌人因为标数据集发了篇 SCI 论文,看着他标了两个多月的数据集这么辛苦,就想着人工智能都能站在围棋巅峰了,难道不能动动小手为本人标数据吗?查了一下还真有一些可能满足此需要的框架,比方 cvat 、 doccano 、 label studio 等,通过简略的比照后发现还是 label studio 最好用。本文首先介绍了 label studio 的装置过程;而后应用 MMDetection 作为后端人脸检测标记框架,并通过 label studio ml 将 MMDetection 模型封装成 label studio 后端服务,实现数据集的主动标记1;最初参考 label studio ml 示例,为本人的 MMDetection 人脸标记模型设计了一种迭代训练方法,使之可能一直随着标记数据的减少而跟进训练,最终实现了模型主动标记数据集、数据集更新迭代训练模型的闭环。 依赖装置本我的项目波及的源码已开源在 label-studio-demo 中,所应用的软件版本如下,其中 MMDetection 的版本及配置参考 MMDetection 应用示例:从入门到出门 : 软件版本label-studio1.6.0label-studio-ml1.0.8label-studio-tools0.0.1本文最终我的项目目录构造如下: LabelStudio├── backend // 后端性能│ ├── examples // label studio ml 官网示例(非必须)│ ├── mmdetection // mmdetection 人脸检测模型│ ├── model // label studio ml 生成的后端服务 (主动生成)│ ├── workdir // 模型训练时工作目录│ | ├── fcos_common_base.pth // 后端模型根底权重文件│ | └── latest.pth // 后端模型最新权重文件│ └── runbackend.bat // 生成并启动后端服务的脚本文件├── dataset // 试验所用数据集(非必须) ├── label_studio.sqlite3 // label studio 数据库文件├── media │ ├── export│ └── upload // 上传的待标记数据集└── run.bat // 启动 label studio 的脚本文件(非必须)label studio 装置启动label-studio 是一个开源的多媒体数据标注工具(用来提供根本标注性能的GUI),并且能够很不便的将标注后果导出为多种常见的数据格式。其装置办法次要有以下几种: ...

November 27, 2022 · 7 min · jiezi

关于python:oeasypython0021python虚拟机的位置可执行文件转化为字节形态

程序实质回顾上次内容\n 就是换行 他对应着 ascii 字符的代码是(10)10进制他的英文是 LF,意思是Line Feed咱们能够在《安徒生童话》中找到每个字符对应的字节状态 不光txt文件是文件咱们的python游乐场实质上也是一个二进制可执行的文件这个文件在哪?咱们能够读懂这个可执行文件吗?python3 到底是个啥?which python3ll /usr/bin/python3这个 python3 是一个符号链接文件只有9字节他指向 python3.8python3.8 也在 /usr/bin 外面就是/usr/bin/python3.8 python3.8 是一个5.3M的文件能够看得见能够间接运行这个phthon3.8吗?间接运行/usr/bin/python3.8python3.8 就在硬盘里呆着 地位就在/usr/bin/python3.8 usr 是 unix software resourcebin 是二进制 binarypython3.8 是这个文件的名称在运行命令的时候 把这个文件从硬盘装载到内存而后用 cpu 开始逐行执行文件中的0101指令能够把他复制到shiyanlou用户的宿主文件夹下吗?复制 复制到shiyanlou用户文件夹下 再察看#把/usr/bin/python3这个py文件的解释器拷贝到~(以后用户文件夹)#cp的意思是copycp /usr/bin/python3 ~#确认python3曾经拷到~(以后用户文件夹)#ls的意思是listls ~/python3.8#查看python3文件细节ls -lah ~/python3.8python3 指向的 python3.8 只有 5.3M 这个可执行文件怎么这么小?5.3M 这也就是一张照片的大小以前的 Python3.5 只有 4.3M 更小目前这 5.3M 的 Python3 外面到底有什么呢?钻研 python3#用vi关上这个刚拷贝过去的python3vi ~/python3.8这个样子看起来 全是乱码齐全看不懂啊 这个货色咱们的确看不懂以字节模式察看python3.8vi ~/python3.8用vim关上~/python3.8 : 进入命令行模式:%!xxd咱们能够看到这个文件的二进制状态 %是指的对于所有行的范畴!是执行外部命令xxd指的是转化为 16 进制模式什么是xxd命令呢?xxdxxd 能够查看文件的二进制状态 dump的本意是(倾倒垃圾)这里指的是转储把文件转储为16进制模式汇编代码模式 :xxd –r 能够还原回去 :%!xxd 转成字节状态:%!xxd –r 转回文本状态重复横跳...另存为python3.8hex一行是(16)10 进制 个字节 ...

November 27, 2022 · 1 min · jiezi

关于python:Python脚本模拟网站SF微信第三方登录

最近思否关注者激增几十人,感觉很是奇怪,想着能够给新关注用户发个问候信息之类。于是便想通过脚本的模式,给用户发送音讯。但token获取是个问题,便想着也用脚本自动化。用户名明码登录会有验证码。那就应用微信第三方登录吧,正好坚固下OAuth。1. 剖析整个登录流程Chrome隐衷模式下,关上开发者模式,再关上https://segmentfault.com/。 1.1 微信OAuth2.0受权地址获取 能够看到,默认登录形式就是微信登录。而微信OAuth地址获取入口为固定URL。这个同样也能够在JS源码中找到umi.js。 地址为: https://segmentfault.com/gateway/session/oauth/weixin/redirect?is_mobile=0 再看该申请的返回数据: { "redirect_url":"https:\/\/open.weixin.qq.com\/connect\/qrconnect?appid=wxd8936345ec1df5ac&redirect_uri=https%3A%2F%2Fsegmentfault.com%2Fuser%2Foauth%2Fweixin&response_type=code&scope=snsapi_login#wechat_redirect"}失去redirect_url为: https://open.weixin.qq.com/connect/qrconnect?appid=wxd8936345ec1df5ac&scope=snsapi_login&redirect_uri=https://segmentfault.com/user/oauth/weixin&state=&login_type=jssdk&self_redirect=default&styletype=&sizetype=&bgcolor=&rst=&href=https://s.segmentfault.com/css/weixin.css 咱们解析一下该URL的参数: appid: wxd8936345ec1df5acscope: snsapi_loginredirect_uri: https://segmentfault.com/user/oauth/weixinstate: login_type: jssdkself_redirect: defaultstyletype: sizetype: bgcolor: rst: href: https://s.segmentfault.com/css/weixin.css能够发现,其实不通过SF提供的地址也是能够的。至此已失去受权地址。 1.2 登录二维码获取在Chrome上,会主动展现二维码。上面咱们剖析下二维码的起源及展现内容。在浏览器上独自拜访上文的redirect_url。 先看下二维码的地址。https://open.weixin.qq.com/connect/qrcode/0913LA3008yh0w3q。在看下原始网页中的内容。 咱们能够发现,这一串内容在他们外部叫做uuid。只有拿到这个uuid就能拿到二维码。 在看一下二维码外面具体的内容。 https://open.weixin.qq.com/connect/confirm?uuid=031J67qn4WUy0w3b能够看到,这个confirmURL惟一重要的参数就是uuid。拿到了UUID就拿到了二维码。 1.3 扫描后果在哪里 能够看到页面始终在做长轮询,距离为15秒。返回后果: window.wx_errcode=408;window.wx_code='';地址为: https://lp.open.weixin.qq.com/connect/l/qrconnect?uuid=031J67qn4WUy0w3b&_=1669547560624 参数: uuid: 为受权申请二维码_: 工夫戳 (应该是防止缓存之类)通过屡次尝试剖析发现。 目前已知wx_errcode: - 402:二维码过期 - 404:已扫码(未操作) - 405:扫码确认登录(有wx_code返回) - 408:未扫码(初始状态)初始值始终为408,而后长轮询。当用户扫码后,返回值变为404,此时申请参数须要减少last=404持续为止长轮询。当用户确认后,返回405,此时wx_code会有值。也就是OAuth协定中最重要的code(该code仅一次无效)有了该code,SF便能够去微信获取用户数据(当然最重要的是openid和unionid)。便可依据该openid获取到关联的用户,并生成该用户的token并返回给前端。 1.4 登录接口(code换token)1.4.1 形式一在Chrome开发者工具中,能够看到申请:https://segmentfault.com/user/oauth/weixin?code=011hcEml2K03ka5gEWll2UUfkI0ckHQR&state=。在其响应头中能够看到有set-cookie: PHPSESSID。该PHPSESSID即为token。 1.4.2 形式二在Chrome开发者工具中,能够看到申请https://segmentfault.com/gateway/session/oauth/weixin/user。参数为: { "type": "weixin", "code": "011hcEml2K03ka5gEWll2UUfkI0ckHQR"}然而该接口却没有任何响应体及无效响应头。但通过不申请形式一仅申请该接口时发现,响应头中有set-token响应头,而内容即为token。 2. 代码实现内部库: requests: 用于发送申请qrcode_terminal: 用于在Terminal展现二维码代码详见: https://gist.github.com/lpe234/f5bcb13ec03e3102357844e8a091e92c ...

November 27, 2022 · 1 min · jiezi

关于python:九Python-MySQL

Python & MySQL 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、根底应用在Python中,应用第三方库:pymysql 来实现对MySQL数据库的操作。 1.1 装置pymysql装置: pip install pymysql pycharm 1.2 创立到MySQL的数据库链接from pymysql import Connection# 获取到mysql数据库的链接对象conn = Connection( host='127.0.0.1', # 主机名 port=3306, # 端口号 user='root', # 用户名 password='123123', # 明码)print(conn.get_server_info())# 敞开数据库链接conn.close()1.3 执行SQL语句如何获取链接对象? from pymysql import Connection 导包Connection(主机,端口,账户,明码) 即可失去链接对象链接对象.close() 敞开和MySQL数据库的连贯游标对象应用fetchall()办法,失去的是全副的查问后果,是一个元组这个元组外部嵌套了元组,嵌套的元组就是一行查问后果from pymysql import Connection# 获取到mysql数据库的链接对象conn = Connection( host='127.0.0.1', port=3306, user='root', password='123123',)# 获取游标对象cursor = conn.cursor()# 应用游标对象执行sql语句conn.select_db('my_db_01')# 执行sqlcursor.execute("select * from article") # 游标对象.execute()执行SQL语句results: tuple = cursor.fetchall() # 游标对象.fetchall()失去全副的查问后果封装入元组内# print(results)for r in results: print(r)# 敞开数据库链接conn.close()二、数据插入pymysql 在执行数据插入或其它产生数据更改的SQL语句时,默认是须要提交更改的,即,须要通过代码“确认”这种更改行为。 ...

November 27, 2022 · 1 min · jiezi

关于python:八面向对象

面向对象 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、初识对象应用对象组织数据 在程序中是能够做到和生存中那样,设计表格、生产表格、填写表格的组织模式的。 在程序中设计表格,咱们称之为:设计类(class) class Student: name = None在程序中打印生产表格,咱们称之为:创建对象 # 基于类创建对象stu1 = Student()stu2 = Student()在程序中填写表格,咱们称之为:对象属性赋值 stu1.name = '111'stu2.name = '111'二、成员办法2.1 类的定义和应用类的应用语法: class是关键字,示意要定义类了类的属性,即定义在类中的变量(成员变量)类的行为,即定义在类中的函数(成员办法)class 类名称: 类的属性 类的行为创立类对象的语法: 对象 = 类名称()2.2 成员变量和成员办法类中定义的属性(变量),咱们称之为:成员变量类中定义的行为(函数),咱们称之为:成员办法 2.2.1 成员办法的定义语法def 办法名(self, 行参1, ..., 行参n): 办法体能够看到,在办法定义的参数列表中,有一个:self关键字self关键字是成员办法定义的时候,必须填写的。 它用来示意类对象本身的意思当咱们应用类对象调用办法的是,self会主动被python传入在办法外部,想要拜访类的成员变量,必须应用selfdef say_hi(self): print(f"hi大家好,我是{self.name}")注意事项:self关键字,只管在参数列表中,然而传参的时候能够疏忽它。三、类和对象基于类创建对象的语法: 对象名 = 类名称() 四、构造方法Python类能够应用:__init__()办法,称之为构造方法。 能够实现: 在创立类对象(结构类)的时候,会主动执行。在创立类对象(结构类)的时候,将传入参数主动传递给__init__办法应用。在构造方法内定义成员变量,须要应用self关键字class Student: def __init__(self, name, age, address): self.name = name self.age = age self.address = addressstu = Student('天天', 30, '1111')案例: 学生信息录入 ...

November 26, 2022 · 3 min · jiezi

关于python:自学python

一、软件装置及工具筹备1.装置python装置python3:brew install python3查看命令:python3【间接回车】,如图则证实曾经胜利装置,否则为未装置【退出时可输出:exit()而后点回车】 2.装置pip# 下载安装脚本curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 运行装置脚本sudo python3 get-pip.py #常用命令#降级命令pip pip3 install -U pip#安装包命令pip install Package # 最新版本pip install Package==1.0.4 # 指定版本pip install 'Package>=1.0.4' # 最小版本查看命令:pip3 --version【python3版本的命令】如图:证实曾经胜利装置 3.装置Vscode 【Download Visual Studio Code】 装置汉化插件【扩大插件搜寻 chinese】 装置python插件【扩大插件搜寻 python】 配置python运行指向python3的门路 装置python插件【扩大插件搜寻 code runner】装置胜利后点击.py文件,右上角呈现运行小三角即代表胜利 二、Python 学习(入门级别)1.Python 数据类型内置数据类型,在编程中,数据类型是一个重要的概念。变量能够存储不同类型的数据,并且不同类型能够执行不同的操作。在这些类别中,Python 默认领有以下内置数据类型: 类型变量文本类型str数值类型int, float, complex序列类型list, tuple, range映射类型dict汇合类型set, frozenset布尔类型bool二进制类型bytes, bytearray, memoryviewPython 数字 #Python 中有三种数字类型:int、float、complex#为变量赋值时,将创立数值类型的变量,实例:x = 10 # inty = 6.3 # floatz = 2j # complex#如需验证 Python 中任何对象的类型,请应用 type() 函数,实例:print(type(x)) #<class 'int'>print(type(y)) #<class 'float'>print(type(z)) #<class 'complex'>Python 字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。 ...

November 26, 2022 · 8 min · jiezi

关于python:oeasypython0020换行字符feedlinelf反斜杠nB语言安徒生童话

换行字符回顾上次内容struct包能够让咱们应用封包格局 把数字封包到字节里 pack函数负责封包unpack函数负责解封咱们通过封到不同的字节状态 遍历了一次ascii码 还是有那片彩色的区域 如同是一片光明森林!那外面到底有些什么机密?咱们这次向光明森林区域进发!!整理行装登程!chr先看看"oeasy"这个字符串是如何存在的 字符都对应着一个数字 数字在计算机上到底是如何存储的呢?用二进制模式存储在字节中的能够看看这个二进制模式么?chr8bit 形成 byte 上图的字节为 (0011 0101)2(35)16对应着字符'5' 那字母呢?abcd在内存里长什么样子?文件编码编写一个文件 写下 abcd用 :%!xxd:%!xxd -r 变回来 能够看到文件是用 2进制 形式存储的 0x61 - a0x62 - b0x63 - c0x64 - d不论是内存、硬盘还是网络传输 a 对应 (0x61)16(0b01100001)2图中最初的那个 0x0a 对应什么字符???善用函数应用chr失去相干字符 0x0a对应的是'\n'这个字符这个字符如同在哪里见过?回到最后想要理解这个'\n' 咱们还得回到最后咱们回到开始的时候 后面介绍过 BWK写的 c 语言的第一个程序\n留神到hello world前面的\n了么? 留神到hello world前面的\n了么?特地留神斜杠的方向 这个方向\叫反斜杠 键盘地位在回车键左近 那\n到底是什么??输入"\n"\n 是一个整体 占一个字节算一个字符序号是(10)10进制也就是(0x0a)16进制这就是在开篇时的abcd前面的字符\n在内存里显示为一个. 咱们间接把他输入看看输入输入#输入\nprint("\n")#间接printprint()#查看序号ord("\n")#查看十六进制的序号hex(ord("\n"))输入后果 如同换了 2 行 如果没\n的话,只换 1 行如果有\n的话, 就换 2 行咱们看看ascii码表是如何定义的这第10个字符的找到地位咱们曾经身在在光明森林中 找到了一个落脚点 十进制的10 就是 十六进制的 0x0A 这个数值在 ascii 码表中意思是 LF啥意思?搜寻搜寻\n失去的后果是这样的 LF 意味着 Line Feed喂行喂一行纸 ...

November 25, 2022 · 1 min · jiezi

关于python:教你快速学习Python知识

学习【霍大侠Python经典案例实验班】,实现试验得天猫超市卡! 流动内容:通过实战案例,帮忙小白,初学者疾速学习Python常识!包含:根底语法,Web开发,数据分析,人工智能等等~更重要的是用趣味编程的办法,寓教于乐,保持学习,可能早日找到高薪工作,学以致用! 流动工夫:2022年11月23日——2022年12月9日,奖品每天上午10:00更新,每日限量50张,先到先得~ 流动链接:https://developer.aliyun.com/...

November 25, 2022 · 1 min · jiezi

关于python:pymilvus-通过search-接口读取标量字段

应用 milvus 的 python client sdk pymilvus 因为很久以前应用 pymilvus 的时候,是不反对在 search 获取标量字段的,而是须要通过 pk + query 接口获取 然而听过在 pymilvus2.1+ (蕴含 2.1)的版本中,曾经能够应用 search 获取标量了 2022-11-25 00:14:54.517 | DEBUG | testing.test_milvus:test_003_search:169 - id: 437549830266159482, distance: 38.0, entity: {'company_id': 1, 'id': 437549830266159482, 'meta_id': 2},2022-11-25 00:14:54.517 | DEBUG | testing.test_milvus:test_003_search:169 - id: 437549830266159541, distance: 38.0, entity: {'company_id': 1, 'id': 437549830266159541, 'meta_id': 3},

November 25, 2022 · 1 min · jiezi

关于python:如果通过python的sdk-pymilvus-判断一个-collection-是否存在

删除汇合 计划一: def delete_collection(): from pymilvus import utility utility.drop_collection(settings.MILVUS_CONFIG.collection.name)计划二: from core.milvus.models import collectionconn = connections._fetch_handler('default')if conn.has_collection(settings.MILVUS_CONFIG.collection.name): logger.debug('汇合已存在') collection.drop()

November 23, 2022 · 1 min · jiezi

关于python:Sqlalchemy-数据模型序列化转JSON

Sqlalchemy 能够很不便地做ORMapping,把数据库记录映射为业务实体类的实例,例如上面这样: class Student(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10))if __name__ == '__main__': student = Student.query.get(1) 但这种实例不不便序列化,比方要想在 Flask Web Service 接口中返回这个对象: @app.route('/demo/db', methods=['GET'])def demo_db(): student = Student.query.get(1) return jsonify(student)或者是间接转 JSON 字符串: import jsonjson.dumps(student)都会报错:Object of type Student is not JSON serializable。 在网上搜的话,会有形形色色的答案,大部分都是让你实现某个相似 to_json 的办法,有些基本不论用,有些很麻烦。其实最简略的解决方案就是: 用 python 3.7 引入的 dataclass 装璜器,这个装璜器帮咱们实现了对应的办法,能够间接把类变量申明当做实例变量的定义: from dataclasses import dataclass@dataclassclass Student(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) city = db.Column(db.String(50)) addr = db.Column(db.String(200)) pin = db.Column(db.String(10))这时候,再调用 jsonify(student)就不会报错了,但奇怪的是,后果是个空对象:{}。原来 dataclass 装璜器“认可”的字段申明,必须有 type annotation,改成上面这样: ...

November 23, 2022 · 1 min · jiezi

关于python:隐语-PSI-benchmark-白皮书

导语: 为了不便大家理解隐语的Benchmark,本文设计了10分钟上手手册,蕴含了亮点介绍、SecretFlow集群的易用搭建、Benchmark脚本、两方和三方的Benchmark,使相干业务方做调研时不便拿到可度量的性能数据和可复现的门路。 隐语PSI亮点隐衷汇合求交(Private Set Intersection,PSI)是一类特定的多方平安计算(Multi-Party Computation, MPC)问题,其问题能够简略了解为:Alice 输出汇合 X,Bob 输出汇合 Y,单方执行 PSI 协定能够失去 Alice 和 Bob 两者的交加,同时不在交加范畴内的局部是受爱护的,即 Alice 和 Bob 无奈学习出交加以外的任何信息。 隐衷汇合求交(PSI)协定有很多分类办法,依照底层依赖的明码技术分类次要包含: 基于公钥明码的PSI计划,包含:基于断定型密钥替换(Decisional Diffie-Hellman,DDH)的PSI计划和RSA盲签名的PSI计划;基于不经意传输(Oblivious Transfer,OT)的PSI计划;基于通用MPC的PSI计划,例如基于混同电路(Garbled Circuit,GC)的PSI计划;基于同态加密(Homomorphic Encryption,HE)的PSI计划。隐衷汇合求交(PSI)协定依照参与方的数量进行分类,可分为: 两方PSI:参与方为2个;多方PSI:参与方>2个。隐衷汇合求交(PSI)协定依照设定平安模型分类,可分为: 半诚恳模型的PSI;歹意模型的PSI。SecretFlow SPU 实现了半诚恳模型下的两方和三方PSI协定,密钥平安强度是128bit,统计平安参数是40bit。 两方PSI协定:基于DDH的PSI(Private Set Intersection)协定基于DDH的PSI协定先对简略易于了解和实现,依赖的明码技术已被宽泛论证,通信量低,但计算量较大。 隐语实现了基于椭圆曲线(Elliptic Curve)群的DDH PSI协定,反对的椭圆曲线类型包含:Curve25519,SM2,Secp256k1。本次benchmark选用的曲线是Curve25519。 基于OT扩大的KKRT16KKRT16是第一个千万规模(224)求交工夫在1分钟之内的PSI计划,通信量较大; 隐语实现了KKRT16协定,并参考了进年来的性能优化和平安改良计划,例如:stash-less CuckooHash,[GKWW20]中 FixedKey AES作为 correlation-robust 哈希函数。 基于PCG的BC22BC22 PSI依赖的PCG(Pseudorandom Correlation Generator)计划是近年来mpc方向的钻研热点,相比KKRT16计算量和通信两方面都有了很大改良,从老本(monetary cost)角度更能满足理论业务需要。PCG实现依赖LPN(Learning Parity with Noise)问题,因为是2022年最新的协定,协定的安全性还须要更多明码专家的剖析和论文。 隐语v0.7中实现了BC22 PSI计划,其中的PCG/VOLE应用了emp-zk中的[WYKW21]实现,欢送大家审查和进一步改良; 三方PSI(Private Set Intersection)协定基于DDH的三方PSI协定隐语实现了自研的基于 ECDH 的三方 PSI 协定,留神咱们实现的这个协定会透露两方交加大小,请自行判断是否满足应用场景的安全性,本次benchmark选用的曲线是Curve25519。 复现形式一、测试机型环境Python:3.8pip: >= 19.3OS: CentOS 7CPU/Memory: 举荐最低配置是 8C16G硬盘:500G二、装置conda应用conda治理python环境,如果机器没有conda须要先装置,步骤如下: # 别离在三台机器的root目录下执行# sudo apt-get install wgetwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh# 装置bash Miniconda3-latest-Linux-x86_64.sh# 始终按回车而后输出yesplease answer 'yes' or 'no':>>> yes# 抉择装置门路, 文件名前加点号示意暗藏文件Miniconda3 will now be installed into this location:>>> ~/.miniconda3# 增加配置信息到 ~/.bashrc文件Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no][no] >>> yes# 运行配置信息文件或重启电脑source ~/.bashrc# 测试是否装置胜利conda --version ...

November 23, 2022 · 3 min · jiezi

关于python:oeasypython0019-打包和解包structpackunpack

打包和解包回顾上次内容ASCII 由这样几类字符形成 英文大写字符英文小写字符数字符号电报时代对于英文、数字的编码 应用的是摩斯电码 这摩斯电码是3进制的编码方式 长短空怎么演化成ascii这种0101的二进制编码的呢?回到 ASCII 码电报传过来的信号须要记录下来 于是有了电传打字机(tele-typewriter)电传打字机须要对立的编码字母和数字ASCII的第一个商业用途 是作为一个七位电传打字机(tele-typewriter)代码 要把滴、答、停的电报信号 变成0和1的二进制信号ASCII的演变(evolve)1960年10月6日 美国规范协会(ASA)X3的首次会议ASCII规范的工作开始了美国规范协会 现为美国国家标准协会American National Standards Institute简称ANSI开始敲定ASCII具体编码 贝尔公司次要经营电报电话编码起源第一次(ASA X3.4-1963)就明确 大小写字母之间只差一个位这很重要 否则谬误编码一旦成为规范 所有利用这种谬误编码的文件 就都废掉了我想把所有 ASCII 字符 0-127 全都打进去 能够么?回顾show.py回顾编写show.pyfor n in range(0xff): print(chr(n),end="") if n % 16 == 0: print()的确能够进去 这输入靠的是 把序号转化成字符的函数 chr然而没有看到0 实践上在1之前好像被光明森林所淹没我是否将字节解码(decode)来干这个事?struct首先是要取得从0到127的字节状态struct 是一个包(module) 导入struct包 struct是构造的意思 来自于c外面罕用类型的存储构造这个struct怎么用呢?pack 把数字变成字节的状态 把0x61这个数字变成字节的状态 "a" 不是字符吗? 怎么成了字节了?字节表示法留神细节 留神"a"后面还有一个b "a"是字符b"a" 是字节 这两类型齐全不同字节b"a"是什么呢?字节状态字节状态能够用两个16进制数来示意 b"a" 相当于b"\x61" b"a" 和 b"\x61" 是同样的一个字节 就是字符"a"在字节里的样子 为了分明起见 把b"\x61"示意为b"a"这样也就间接看到了字符刚好ord("a") 就是 0x61如何了解struct.pack呢?封包pack按要求把货色封进规定的封装外面 把数字封在1个Byte外面 察看他的字节状态遍历import structfor n in range(0,128): b = struct.pack("b",n) print(b,end=",")把从0-127的数字都封到字节外面 ...

November 23, 2022 · 1 min · jiezi

关于python:python-使用-imagehash-库生成-ahash并存入-milvus

有一个需要:计算图片的类似度 须要解决两个问题: 生成 ahash存储和计算 ahash 之间的间隔生成 ahash『生成 ahash』 选用 python 上面的一个 imagehash 库。(github:https://github.com/JohannesBu...) from io import BytesIOimport numpyimport imagehashfrom PIL import Imagedef create_vector(file: BytesIO) -> bytes: image = Image.open(file) hash = imagehash.average_hash(image) _vector = [] for h in hash.hash: _vector.extend(h) vector = bytes( numpy.packbits( [ int(v) for v in _vector ], axis=-1 ).tolist() ) return vectorcreate_vector 函数输入的类型是 bytes,就是二进制序列 imagehash.average_hash(image) 输入的 hash 对象,hash 对象有一个 hash 属性,这个属性的类型是 list[list[bool]]打印进去就是长上面这样子,其实就是一个 8x8=64 bit 的序列 ...

November 23, 2022 · 2 min · jiezi

关于python:六Python文件操作

Python文件操作 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、文件的编码计算机中有许多可用编码: UTF-8GBKBig5等UTF-8是目前全球通用的编码格局除非有非凡需要,否则,一律以UTF-8格局进行文件编码即可。二、文件的读取2.1 open()关上函数留神:此时的f是open函数的文件对象,对象是Python中一种非凡的数据类型,领有属性和办法,能够应用对象.属性或对象.办法对其进行拜访,后续面向对象课程会给大家进行具体的介绍。name:是要关上的指标文件名的字符串(能够蕴含文件所在的具体门路)。mode:设置关上文件的模式(拜访模式):只读、写入、追加等。encoding:编码格局(举荐应用UTF-8)open(name, mode, encoding)例子: f = open('./test.txt', 'r', encoding='utf-8')2.2 mode罕用的三种根底拜访模式模式形容f以只读形式关上文件。文件的指针将会放在文件的结尾。这是默认模式。w关上一个文件只用于写入。如果该文件已存在则关上文件,并从结尾开始编辑,原有内容会被删除 。如果该文件不存在,创立新文件。a关上一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创立新文件进行写入。2.3 读操作相干办法操作汇总 操作性能文件对象 = open(file, mode, encoding)关上文件取得文件对象文件对象.read(num)读取指定长度字节<br/>不指定num读取文件全副文件对象.readline()读取一行文件对象.readlines()读取全副行,失去列表for line in 文件对象for循环文件行,一次循环失去一行数据文件对象.close()敞开文件对象with open() as f通过with open语法关上文件,能够主动敞开2.3.1 read()办法:# num示意要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就示意读取文件中所有的数据。文件对象.read(num)2.3.2 readlines()办法:readlines能够依照行的形式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。 f = open('python.txt')content = f.readlines()# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']print(content)# 敞开文件f.close()例:readline()办法:一次读取一行内容 f = open('python.txt')content = f.readline()print(f'第一行:{content}')content = f.readline()print(f'第二行:{content}')# 敞开文件f.close()for循环读取文件行: for line in open("python.txt", "r"): print(line)# 每一个line长期变量,就记录了文件的一行数据2.3.3 close() 敞开文件对象f = open("python.txt", "r")f.close()# 最初通过close,敞开文件对象,也就是敞开对文件的占用# 如果不调用close,同时程序没有进行运行,那么这个文件将始终被Python程序占用。2.3.4 with open 语法with open("python.txt", "r") as f: f.readlines()# 通过在with open的语句块中对文件进行操作# 能够在操作实现后主动敞开close文件,防止忘记掉close办法案例:通过文件读取操作,读取此文件,统计itheima单词呈现的次数 ...

November 22, 2022 · 1 min · jiezi

关于python:五Python数据容器

Python数据容器 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、数据容器:list(列表)列表内的每一个数据,称之为元素 以 [] 作为标识列表内每一个元素之间用, 逗号隔开定义语法: [元素1, 元素2, 元素3, ......] 例: list = ['iii', 666, '你好']1.1 list取出元素列表中的每一个元素,都有其地位下标索引,从前向后的方向,从0开始,顺次递增或者递加 语法:列表[下标],即可取出 1.2 列表的罕用操作(办法)1.2.1 列表的查问性能(办法)性能:查找指定元素在列表的下标,如果找不到,报错ValueError语法:列表.index(元素) 1.2.2 列表的批改性能(办法)批改特定地位(索引)的元素值: 语法:列表[下标] = 值能够应用如上语法,间接对指定下标(正向、反向下标均可)的值进行:从新赋值(批改)插入元素: 语法:列表.insert(下标, 元素),在指定的下标地位,插入指定的元素追加元素: 语法:列表.append(元素),将指定元素,追加到列表的尾部追加元素形式2: 语法:列表.extend(其它数据容器),将其它数据容器的内容取出,顺次追加到列表尾部删除元素: 语法1: del 列表[下标]语法2:列表.pop(下标)删除某元素在列表中的第一个匹配项: 语法:列表.remove(元素)清空列表内容: 语法:列表.clear()统计某元素在列表内的数量 语法:列表.count(元素)1.2.3 列表的查问性能(办法)统计列表内,有多少元素 语法:len(列表) 能够失去一个int数字,示意列表内的元素数量list = [21, 25, 21, 23, 22, 20]list.append(31)list.extend([29, 33, 30])listone = list.pop()idx = list.index(31)print(idx)应用形式作用列表.append(元素)向列表中追加一个元素列表.extend(容器)将数据容器的内容顺次取出,追加到列表尾部列表.insert(下标, 元素)在指定下标处,插入指定的元素del 列表[下标]删除列表指定下标元素列表.pop(下标)删除列表指定下标元素列表.remove(元素)从前向后,删除此元素第一个匹配项列表.clear()清空列表列表.count(元素)统计此元素在列表中呈现的次数列表.index(元素)查找指定元素在列表的下标 找不到报错ValueErrorlen(列表)统计容器内有多少元素1.3 列表的特点能够包容多个元素(下限为2**63-1、9223372036854775807个)能够包容不同类型的元素(混装)数据是有序存储的(有下标序号)容许反复数据存在能够批改(减少或删除元素等)1.4 列表的遍历1.4.1 列表的遍历 - while循环def while_list(): list = [11, 12, 13] index = 0 while index < len(list): el = list[index] print(f'元素:{el}') index += 1while_list()1.4.2 列表的遍历 - for循环def for_list(): list = [1, 2, 3, 4, 5] for v in list: print(f'元素:{v}')for_list()练习案例:取出列表内的偶数 ...

November 21, 2022 · 2 min · jiezi

关于python:oeasypython0018-ASCII字符分布数字大小写字母符号黑暗森林

打包和解包回顾上次内容decode 就是解码解码和编码能够转化 encode 编码decode 解码互为逆过程大小写字母之间序号全都相差(32)10进制 这是为什么呢?差距大写字母和小写字母 总是相差(32)10进制 从10进制角度看不清楚咱们从16进制的角度看看16进制正好是(0x20)16进制 为什么不多不少 就差 0x20 呢?怎么那么寸呢?转化为2进制之后 恰好是1位(bit)这是偶尔的吗?ASCII 码表趣事其实最后相差的并不是 0x20 之前 ibm 的 EBCDIC 编码也是这样的 也相差一个2进制位 EBCDIC问题是字母不间断 i、j之间不间接相连EBCDIC最终被ascii所淘汰ASCIIASCII字母是间断的 而且大小写字母间相差正好是 1个 二进制位对应 b6 这个位那为什么要差 1个 二进制位 呢? 有了这种对应关系之后 做大小写不敏感的字符串查找就快多了这个 0x20 产生在 1963 年 5 月 The X3.2.4 task group voted its approval for the change to ASCII at its May 1963 meeting.Locating the lowercase letters in columns 6 and 7 caused the characters to differ in bit pattern from the upper case by a single bit, which simplified case-insensitive character matching and the construction of keyboards and printers.过后的目标是 ...

November 21, 2022 · 1 min · jiezi

关于python:电视剧里的代码真能运行吗

大家好,欢送来到 Crossin的编程教室 ! 前几天,后盾老有小伙伴留言“爱心代码”。这不是Crossin很早之前发过的内容嘛,怎么最近忽然又被人翻出来了?起初才晓得,原来是一部无关程序员的青春偶像剧《点燃我,和煦你》在热播,而剧中有一段对于期中考试要用程序画一个爱心的桥段。 于是出于好奇,Crossin就去看了这一集(第5集,不用谢)。这一看不要紧,差点把刚吃的鸡腿给喷出来--槽点切实太多了! 忍不住做了个欢畅吐槽向的代码解读视频,在某平台上被顶到了20个w的浏览,也算蹭了一波人家电视剧的热度吧…… https://www.bilibili.com/vide... 上面是图文版,给大家剖析下剧中呈现的“爱心”代码,并且来复刻一下最初男主实现的酷炫跳动爱心。 剧中代码赏析首先是路人同学的代码: 尽管剧中说是“C语言期中考试”,但这位同学的代码名叫 draw2.py,一个典型的 Python 文件,再联合截图中的 pen.forward、pen.setpos 等办法来看,应该是用 turtle 海龟作图库来画爱心。那成果通常是这样的: import turtle as tt.color('red')t.setheading(50)t.begin_fill()t.circle(-100, 170)t.circle(-300, 40)t.right(38)t.circle(-300, 40)t.circle(-100, 170)t.end_fill()t.done() 而不是剧中那个命令行下用1组成的不规则的图形。 而后是课代表向路人同学展现的优良代码: 及所谓的成果: 这的确是C语言代码了,但文件仍然是以 .py 为后缀,并且 include 后面没有加上 #,这显然是没法运行的。 外面的内容是能够画出爱心的,用是这个爱心曲线公式: 而后遍历一个1517的方阵,计算每个坐标是在曲线内还是曲线外,在外部就输入#或,内部就是- 用python改写一下是这样的: for y in range(9, -6, -1): for x in range(-8, 9): print('*##*'[(x+10)%4] if (x*x+y*y-25)**3 < 25*x*x*y*y*y else '-', end=' ') print()成果: 略微改一下输入,还能做出后面那个全是1的成果: for y in range(9, -6, -1): for x in range(-8, 9): print('1' if (x*x+y*y-25)**3 < 25*x*x*y*y*y else ' ', end=' ') print() ...

November 21, 2022 · 2 min · jiezi

关于python:二Python判断语句

Python判断语句 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、布尔类型和比拟运算符1.1 布尔类型进行判断,只有2个后果: 是否Python中罕用的有6种值(数据)的类型 1.1.1 布尔类型的定义布尔类型的字面量: True 示意真(是、必定)False 示意假 (否、否定)定义变量存储布尔类型数据:变量名称 = 布尔类型字面量 1.2 比拟运算符布尔类型的数据,不仅能够通过定义失去,也能够通过比拟运算符进行内容比拟失去 运算符形容示例==判断内容是否相等,满足为True,不满足为False如a=3,b=3,则(a == b) 为 True!=判断内容是否不相等,满足为True,不满足为False如a=1,b=3,则(a != b) 为 True>判断运算符左侧内容是否大于右侧 <br/> 满足为True,不满足为False如a=7,b=3,则(a > b) 为 True<判断运算符左侧内容是否小于右侧 <br/> 满足为True,不满足为False如a=3,b=7,则(a < b) 为 True>=判断运算符左侧内容是否大于等于右侧 <br/> 满足为True,不满足为False如a=3,b=3,则(a >= b) 为 True<=判断运算符左侧内容是否小于等于右侧 <br/> 满足为True,不满足为False如a=3,b=3,则(a <= b) 为 True二、if语句的根本格局格局:if 要判断的条件:&nbsp;&nbsp; 条件成立时,要做的事件`留神:判断语句的后果,必须是布尔类型True或False,True会执行if内的代码语句,False则不会执行` age = 10if age >= 18: print('曾经成年') print('行将大学')print('工夫真快~~') 三、if else 语句else不须要判断条件,当if的条件不满足时,else执行 案例: 留神: else后,不须要判断条件和if的代码块一样,else的代码块同样须要4个空格作为缩进print('欢送来到游乐园,儿童收费,成人免费。')age = input('请输出你的年龄:')if int(age) >= 18: print('您曾经成年,需补票10元')else: print('您是儿童,收费呀')print('祝您玩耍欢快')四、if elif else语句判断是互斥且有程序的。 ...

November 20, 2022 · 1 min · jiezi

关于python:一Python基础语法

Python根底语法 提醒:本文依据b站黑马python课整顿 链接指引 => 2022新版黑马程序员python教程一、字面量字面量:在代码中,被写下来的的固定的值,称之为字面量Python中罕用的有6种值(数据)的类型: 二、字符串字符串(string),又称文本,是由任意数量的字符如中文、英文、各类符号、数字等组成。所以叫做字符的串 类型程序中的写法阐明整数666,-88和事实中的写法统一浮点数(小数)13.14,-5.21和事实中的写法统一字符串(文本)"小叮当呀"程序中须要加上双引号来示意字符串2.1 字符串拼接name = ssprint("111" + "222")print("xx" + name + "qqq")2.2 字符串格式化 %s % 示意:我要占位s 示意:将变量变成字符串放入占位的中央留神:多个变量占位,变量要用括号括起来,并依照占位的程序填入 # p = "你好,呀呀呀%s" % '天天'message = "你好%s,呀呀呀%s" % (11, 444)print(message) Python中,其实反对十分多的数据类型占位,最罕用的是如下三类: 格局符号转化%s将内容转换成字符串,放入占位地位%d将内容转换成整数,放入占位地位%f将内容转换成浮点型,放入占位地位name = 'xixi'pri = 19.99fac = 1.2day = 2print('公司名称:%s,股票:%d,增长;%.3f' % (name, pri, fac*day))2.3 格式化的精度管制咱们能够应用辅助符号"m.n"来控制数据的宽度和精度: m,管制宽度,要求是数字(很少应用),设置的宽度小于数字本身,不失效.n,管制小数点精度,要求是数字,会进行小数的四舍五入示例:%5d:示意将整数的宽度管制在5位,如数字11,被设置为5d,就会变成:空格[空格]11,用三个空格补足宽度。%5.2f:示意将宽度管制为5,将小数点精度设置为2 小数点和小数局部也算入宽度计算。如,对11.345设置了%7.2f 后,后果是:空格11.35。2个空格补足宽度,小数局部限度2位精度后,四舍五入为 .35%.2f:示意不限度宽度,只设置小数点精度为2,如11.345设置%.2f后,后果是11.35 2.4 字符串类型的不同定义形式字符串有3种不同的定义形式: 2.5 字符串格式化形式2语法:f”{变量} {变量}” 这种形式: 不理睬类型不做精度管制name = 'xixi'pri = 19.99fac = 1.2day = 2print(f'公司名称:{name},股票:{pri},增长{fac * day}')2.6 字符串格式化 - 表达式的格式化在无需应用变量进行数据存储的时候,能够间接格式化表达式,简化代码 ...

November 20, 2022 · 2 min · jiezi

关于python:Python冷知识如何找出新版本增加或删除了哪些标准库

“内置电池”是 Python 最为显著的个性之一,它提供了 200 多个开箱即用的规范库。然而,历经了 30 多年的倒退,很多规范库曾经成为了不得不舍弃的历史包袱,因为它们正在“漏电”! 好消息是,Python 正在进行一场“瘦身手术”,详情可查阅: Python 3.12 正在移除大量的模块终于,Python 规范库要做“瘦身手术”了!聊聊 Python 的内置电池那么,咱们会有这样一个话题:当 Python 公布了一个新版本的时候,如何找出它比上一个版本(或者更早版本)减少或删除了哪些规范库呢? 比方,当 Python 公布 3.11.1 版本时,如何找出它相比于上一个版本(即 3.11.0),增删了哪些规范库呢? 兴许你马上就想到了一个方法:查看官网的版本变更文档啊~ 没错,官网文档里必定蕴含了咱们所需的变更信息,然而,每个版本的《What's New》里信息太多了,这种没有特定指标的搜寻,只会费时费力。 如果要跨多个版本进行比拟的话,比方 3.12 与 3.10 间的差别、或者将来的 3.x 跟当初的 3.11 比拟,这个办法就更不好用了吧! 在 3.10 版本之前,想要获知规范库的变动状况,的确不太不便。然而,自 3.10 起,Python 提供了一个十分便捷的办法:sys.stdlib_module_names! 官网文档的形容: 起源:https://docs.python.org/zh-cn/3/library/sys.html?#sys.stdlib_module_names 简略查看下它的内容: 如上可见,sys.stdlib_module_names 返回的是一个 frozenset 类型的对象,其元素是所有规范库的名称。 有了具体的规范库清单后,咱们就能够通过以下的步骤,比拟出不同 Python 版本间的差别啦: (1)获取旧版本的规范库(比方 3.10.0),序列化后存储到文件/数据库中 >>> import sys>>> import pickle>>> with open("libs", "wb") as f:... pickle.dump(sys.stdlib_module_names, f)...(2)获取新版本的规范库(比方 3.11.0),与旧版本的规范库进行比拟 ...

November 19, 2022 · 1 min · jiezi

关于python:Python数据类型转化

输入作用:程序输入内容给用户实例 print('hello Python')age = 18print(age)格式化输入所谓的格式化输入即依照⼀定的格局输入内容。格式化符号格局符号转换%s字符串%d有符号十进制整数%f浮点数%u无符号十进制整数%o八进制整数%x十六进制整数(小写OX)%e小数点前面六位有效数字,以指数模式输入实数%g依据大小主动选f格局或e格局,且不输入无意义的零1、整数的输入num = 123456# %o —— oct 八进制 理解print("打印输出123456的八进制:%o"%num)# %d —— dec 十进制print("打印输出123456的十进制:%d"%num)# %x —— hex 十六进制 理解print("打印输出123456的十六进制:%x"%num)2、浮点数输入number = 180.5# %f ——保留小数点前面六位有效数字print("我的身高是:%f"%number)# %.3f,保留3位小数位print("我的身高是:%.3f"%number)# %e ——保留小数点前面六位有效数字,指数模式输入print("我的身高是:%e"%number)# %.3e,保留3位小数位,应用迷信计数法print("我的身高是:%.3e"%number)# %g ——在保障六位有效数字的前提下,应用小数形式,否则应用迷信计数法print("我的身高是:%g"%number)# %.3g,保留3位有效数字,应用小数或迷信计数法print("我的身高是:%.3g"%number)3、字符串输入# %10s——右对齐,占位符10位 理解print("格式化输入:%10s" % name)print("格式化输入:%+10s" % name)%-10s——左对齐,占位符10位print("格式化输入:%-10s" % name)# %.2s——截取2位字符串# %10.2s——10位占位符,截取两位字符串小技巧 %06d,%.6d示意输入的整数显示位数,不⾜以0补全,超出以后位数则原样输入 %.2f,示意⼩数点后显示的⼩数位数。 实例 age = 18name = '萧何'weight = 105.5student_id = 1hight = 182print('我的名字是%s' % name)# 我的名字是萧何print('我的学号是%4d' % student_id)# 我的学号是0001print('我的体重是%.2f⽄' % weight)# 我的体重是75.50⽄print('我的名字是%s,往年%d岁了,体重是%f斤,身高是%d' % (name, age, weight, hight))# 我的名字是萧何,往年18岁了,体重是105.5斤,身高是182print('我的名字是%s,明年%d岁了' % (name, age + 1))# 我的名字是萧何,明年19岁了4、format的用法绝对根本格式化输入采纳‘%’的办法,format()性能更弱小,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且应用大括号‘{}’作为特殊字符代替‘%’ ...

November 18, 2022 · 1 min · jiezi

关于python:peewee-创建联合索引

class TinyUrl(Model): id = BigAutoField() user_id = IntegerField(null=False) short_uuid = CharField(max_length=255, null=False, help_text='长度为 6 位') long_url_hash = CharField(max_length=64, null=False) long_url = CharField(max_length=2048, null=False) created_at = DateTimeField( null=False, constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')], help_text='应用数据库工夫' ) updated_at = DateTimeField( null=False, constraints=[ SQL('DEFAULT CURRENT_TIMESTAMP'), SQL('ON UPDATE CURRENT_TIMESTAMP'), ] ) class Meta: database = db table_name = 'tiny_url' indexes = ( (('short_uuid',), True), (('user_id', 'long_url_hash'), True), )应用 indexes 就能够了

November 18, 2022 · 1 min · jiezi

关于python:k哥爬虫普法非法入侵计算机信息系统获取1500万余条个人信息

我国目前并未出台专门针对网络爬虫技术的法律标准,但在司法实际中,相干裁决已不足为奇,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对实在案例的剖析,旨在进步宽广爬虫工程师的法律意识,通晓如何非法合规利用爬虫技术,警钟长鸣,做一个违法、护法、有准则的技术人员。案情介绍2018年1月至7月期间,呙某兴通过SQL注入破绽以及编写爬虫脚本的形式,侵入计算机信息零碎,获取计算机系统内存储的大量数据,其中波及到个人信息的数量约为1500万余条,该将其获取的个人信息通过QQ销售给“Versace”、“同花顺”、“FF”、“糖果”等人,从中获利约54万余元。 公诉机关认为,呙某兴违反国家规定,侵入计算机信息零碎,获取该计算机系统中存储的数据,情节特地重大,其行为触犯了《中华人民共和国刑法》第二百八十五条第二款,该当以非法获取计算机信息零碎数据罪追究其刑事责任。 呙某兴对被指控的罪名无异议,但辩称起诉书指控的数量有异议,其只用了20多万条信息;对指控的入侵形式有异议,SQL技术不是入侵技术,爬虫技术只能获取网站页面的信息不能入侵零碎或获取数据。 供述状况被告人呙某兴的辩护人的次要辩护意见: 1.被告人获取计算机信息零碎数据应用的SQL注入破绽是常见的黑客技术,被告人所获取的信息多为网站上公开的信息,只是将SQL形式作为一种收集伎俩、采纳爬虫脚本具备合法性; 2.对起诉书指控波及个人信息数量1500万余条有异议。获取的计算机信息零碎数据有局部有效数据、涉案信息数据存在重复性、非法获利与涉案信息数量不对应; 3.对指控被告人获利54万元有异议,被告人通过爬虫脚本取得信息销售所得利益应属非法收益,应予以扣除; 4.被告人被动交代犯罪事实,认罪悔罪态度好,立功情节较轻,违心缴纳罚金,倡议对其实用缓刑。 法院认为,被告人呙某兴违反国家规定,侵入计算机信息零碎,获取该计算机系统中存储的数据,情节特地重大,其行为已形成非法获取计算机信息零碎数据罪,公诉机关指控成立。 对于被告人及其辩护人所提对起诉书指控波及个人信息数量1500万余条有异议,局部计算机信息零碎系数据系有效数据且存在反复计算问题的辩解和辩护意见,本院认为,公诉机关对被告人获取的信息进行从新梳理,正当推断出1500万余条个人信息,可能辨认特定自然人身份或者反映特定自然人流动状况,故对该项辩解及辩护意见,本院不予驳回。 对于被告人及其辩护人所提获取计算机信息零碎数据应用的SQL注入破绽只是一种收集伎俩、采纳爬虫脚本具备合法性,获取的信息多为网站上公开的信息的辩解和辩护意见,本院认为,被告人应用SQL注入破绽以及编写爬虫脚本的形式侵入计算机信息零碎,获取计算机系统内存储的大量数据,其中波及到个人信息的数量达到约1500万余条,并非网站页面信息,故对该项辩解及辩护意见,本院不予驳回。 对于辩护人所提对指控被告人获利54万元有异议,应扣除被告人通过爬虫脚本取得的非法信息支出的辩护意见,本院认为,被告人通过编写爬虫脚本的形式非法入侵计算机信息零碎,获取计算机系统内贮存的信息并发售所得系守法支出,应计入守法所得,故对该项辩护意见,本院不予驳回。 对于辩护人所提被告人被动交代本人的犯罪事实,认罪悔罪态度好的辩护意见,本院认为,被告人辩称其应用SQL注入破绽以及编写爬虫脚本的形式均未入侵到计算机系统,获取的只是网站页面信息,不属于如实供述本人的罪状,故对该项辩护意见,本院不予驳回。 裁决状况被告人呙某兴犯非法获取计算机信息零碎数据罪,判处有期徒刑五年,并处罚金人民币二万元。对被告人呙某兴守法所得人民币54万元依法予以追缴或责令退赔。 裁决文书全文: https://wenshu.court.gov.cn/w... 反思总结法院以呙某兴未经网站受权,利用特定网站的破绽,应用 SQL 注入破绽以及编写爬虫脚本的形式侵入计算机信息零碎,获取计算机系统内存储的大量数据,其中波及到个人信息的数量达到约1500万余条,且并非网站页面信息为由认定了该行为的非法性,咱们先来理解下 SQL 注入和网络爬虫的基本原理: SQL 注入:当咱们拜访动静网页时, Web 服务器会向数据拜访层发动 SQL 查问申请,如果权限验证通过就会执行 SQL 语句。这种网站外部间接发送的 SQL 申请个别不会有危险,但理论状况是很多时候须要联合用户的输出数据动静结构 SQL 语句,如果用户输出的数据被结构成歹意 SQL 代码,Web 利用又未对动静结构的 SQL 语句应用的参数进行审查,导致其传入的“数据”拼接到 SQL 语句中后,被当作 SQL 语句的一部分执行,可能会导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。网络爬虫:网络爬虫又称网络蜘蛛、网络机器人,它是一种依照肯定的规定主动浏览、检索网页信息的程序或者脚本,网络爬虫可能主动申请网页,并将所须要的数据抓取下来,通过对抓取的数据进行解决,从而提取出有价值的信息,高水准者可 ”所见即所得“,意为只有是能看的内容就能爬取到,重点在于采集的都是失常用户能浏览到的内容。所以侵入计算机信息零碎并不是爬虫所能做到的事,数据库层面的浸透亦或是攻打该当是通过 SQL 注入施行的,而法院将编写爬虫脚本列为呙某兴侵入计算机信息零碎的形式之一,是因为非法获取计算机信息零碎数据罪与进犯公民个人信息罪是法条竞合的关系,指一个犯罪行为同时触犯数个具备容纳关系的具体立功条文,依法只实用其中一个法条定罪量刑的状况。不论是如呙某兴辩护中所述其利用爬虫技术采集的是某些网站上公开的个人信息,亦或是利于 SQL 注入技术浸透进数据库,再利用爬虫批量采集个人信息,这都是触犯了法律的 “红线” 的,实践上看,爬虫作为一项网络信息搜寻技术,具备技术中立性,并未被我国现行法律所明令禁止,然而在司法实务中,“技术中立准则” 的实用是有边界的,如果应用技术的人用以危害社会,利用技术手段施行犯罪行为,则不因 “技术中立准则” 而罢黜刑事责任,如果波及的是公民个人信息,基于特别法条优先于普通法条的准则,呙某兴的行为,实用于进犯公民个人信息罪,对于公民个人信息数据肯定要慎之又慎! 须要留神的是,一些网站会采取反爬措施,包含封 IP、封账号、JS 参数加密、代码混同、浏览器指纹、TLS 指纹、验证等,以减少爬虫程序资源的老本,更有企业踊跃开发反爬虫技术以限度网络爬虫的拜访权限,绕过网站反爬虫措施获取数据属于违反权力人志愿读取、收集数据,将有较大可能被认定为对计算机信息零碎的 “侵入”,进而以非法获取计算机系统数据罪定罪处罚。对于 “侵入” 的了解:在以往判例中,司法机关次要基于以下两种门路断定对计算机信息零碎的 “侵入”:一是无用户身份的侵入,即通过盗取、破解明码等形式进入零碎;二是超权限拜访的侵入,即具备非法用户身份,但超过本身受权范畴访问信息资源。 信息公开不等同于数据公开,对于爬虫工程师来说,并不需要去厘清概念背地的区别与分割,只是在业务发展中须要建立危险防备意识,贸然爬取公开可见的信息仍会存有肯定刑事危险,认真甄别所要爬取的数据类型,审慎解决蕴含公民个人信息、商业秘密等内容的信息,心愿大家凡事三思而后行,老话长谈,谨记一点,公司是老板的,自在是本人的,法律是不容触犯的!

November 16, 2022 · 1 min · jiezi

关于python:自动化运维看看Python怎样完成自动任务调度⛵

作者:韩信子@ShowMeAI Python3◉技能晋升系列:https://www.showmeai.tech/tutorials/56 本文地址:https://www.showmeai.tech/article-detail/323 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容 打算工作是简直每个开发人员都会用到的性能,在服务器上能够用 Cron 作业来进行任务调度,它也是一种稳固的形式。但咱们也能够齐全程序化,全副应用 Python 来实现调度程序,而且能够有更简略的配置形式。 基于 Python 的任务调度 疾速装置与利用Python工具包 schedule能够轻松地在 Python 中进行任务调度,咱们能够通过 PyPI 疾速装置它。 $ pip install schedule借助于 schedule,咱们简直能够像用自然语言谈话一样疾速构建工作打算和时间表。比方,你想每小时运行一次某个性能函数(比方性能是发邮件的函数send_email) ,写法是这样的: schedule.every().hour.do(send_email)整个过程十分程序化和天然,残缺的一个『构建工作+任务调度』程序如下(咱们把每小时发送一次邮件调整为每天一次了)。 import timeimport scheduledef send_email(): # 发送邮件的操作能够加在这里 print("Sending email...")schedule.every().day.at("14:45").do(send_email)while True: schedule.run_pending() time.sleep(1)下面的代码将在每天下午14:45 调用send_email函数。除书写简略易用之外,schedule 工具库还提供了一系列其余性能。 应用装璜器进行调度咱们能够应用装璜器让代码更加洁净和优雅。schedule 工具包反对开箱即用的装璜器。咱们把下面发送电子邮件的示例改用装璜器实现,代码如下。 import timefrom schedule import repeat, every, run_pending@repeat(every(10).seconds)@repeat(every(5).seconds)def send_email(): # 发送邮件的操作能够加在这里 print("Sending email...")while True: run_pending() time.sleep(1)上述代码示例中,咱们为同一个工作定制了两个打算。第一个将每 10 秒调用一次性能函数,第二个将每 5 秒调用一次。 应用参数运行打算工作咱们有时候会心愿工作的调用更灵便一些,比方如果能够通过传递参数来管制任务调度,那就免去了写死各种细节的问题。上面咱们把发邮件的工作写成可承受参数的模式: @repeat(every(10).seconds)@repeat(every(5).seconds, email="[email protected]")def send_email(email="[email protected]"): # 发送邮件的操作能够加在这里 print(f"Sending email...: to {email}")通过下面的简略解决,咱们能够把电子邮箱当作参数传递给调度工作。如果咱们心愿通过命令行参数给脚本传参,一个示例的代码如下: ...

November 8, 2022 · 1 min · jiezi

关于python:oeasypython0011-字符序号ordinalord

序号(ordinal)回顾上次内容hello world 不是素来就有的 来自于unix和c尽管咱们明天有各种先进的学习伎俩最早的高级语言学习是从最早的那张打字机用纸的手写代码起源的输入用的函数名是 print 打印 也是从那个时候来的最早输入的是字符串是 "hello world" 也是从那个时候来的这就成了一个迷因等等! 计算机外面不都是二进制的 0 和 1 吗哪里来的hello 中的 h 之类的字符呢? 字符实质#进入python3解释器python3咱们这次只输入一个字符'h'#间接写hh#间接写"h""h"#间接写'h''h'#输入hprint("h")这一套在hello world外面曾经玩过了只有h只有字母h的话 游乐场不认h认为是NameError没有定义h这么一个变量 单引号和双引号引起的字母成果一样 因为示意同样的字符串计算机外面不都是二进制的 0 和 1 吗 这个字符h 是如何用 0、1来示意的呢?能够输入这个 h字符 的二进制状态吗?ord 序数#间接写h"h"#输入h的序数ord("h") 咱们通过ord函数 调用字符作为函数参数从而失去字符对应的的序号那这个ord到底什么意思? 什么不会就help什么 查看ord帮忙 进入ord的帮忙后 大抵是对一个单子字符串返回一个unicode码能够按q退回到游乐场ord函数为什么叫做ord呢?查看帮忙ord 对应的单词是 ordinal 序数词 说白了就是挨个给排个号从第一开始数起来... ordinal这个单词又是怎么来的呢?ordinal 这个单词来自于orderorder这个词来自什么呢?orderorder 来自于 织布机外面的一横行的线 这些线是有程序的每一行对应不同的经线所以能力最终出现定制的图案 order这个词外面也有等级的含意 来自于十字军骑士的兄弟会不只是梁山好汉排座次更重要的是辨别出军阶长官能够给上级命令(order)客人订购货物或者菜品 某种意义上也是依照客人的命令执行所以order也是点单或者订货连队或者班次都是有具体序号的 按序号排列就是 in order否则就是out of order先去总结一下总结咱们这次理解了ord函数这个函数能够通过字符失去序号那么能够反过来吗?通过序号失去字符能够吗? - 咱们下次再说!蓝桥->https://www.lanqiao.cn/teache...github->https://github.com/overmind19...gitee->https://gitee.com/overmind198...视频->https://www.bilibili.com/vide... 作者:oeasy

November 7, 2022 · 1 min · jiezi

关于python:使用-kombu-作为-rabbitmq-的消费者客户端-并发消费篇

前提:一个过程一个 amqp 连贯 我原本想用多线程来实现,然而貌似做不到:一个连贯,多个线程生产 然而我又不想一个线程一个连贯,这样太节约连接数了 而后我想到 nameko 是一个过程一个连贯,而后应用 evnetlet 协程来实现,并发生产 所以我写了上面的 demo from loguru import loggerfrom kombu.transport.pyamqp import Messagefrom kombu import Exchange, Queuefrom kombu import Connection, Consumer, Queuefrom concurrent.futures import ThreadPoolExecutorimport timeimport eventleteventlet.monkey_patch()amqp_uri = 'amqp://pon:[email protected]:5672//'pool = eventlet.GreenPool(10)def handle_message(message: Message): logger.debug(message) logger.debug(message.body) time.sleep(1) message.ack(multiple=True)refresh_exchange = Exchange('refresh', type='topic')imdb_queue = Queue('refresh_imdb', refresh_exchange, routing_key='to_imdb', durable=True)queues: list[Queue] = [imdb_queue]def start_consuming(message: Message): pool.spawn_n(handle_message, message)with Connection(amqp_uri) as conn: with conn.channel() as channel: consumer = Consumer( channel, queues=queues, prefetch_count=10, on_message=start_consuming ) with consumer: while True: conn.drain_events()生产一个工作须要 1 秒预取 10 个协程池 size 为 10从上面的生产数据能够看出,是一秒生产 10 个 ...

November 6, 2022 · 1 min · jiezi

关于python:kombu-维护消费者心跳

单线程对于只有一个过程一个线程一个 amqp 连贯的状况 咱们开了一个连贯用来工作生产,这个时候,咱们须要一个『后盾』来帮咱们保护 amqp 的心跳 怎么实现这个『后盾』呢? 抉择其实很多,比方: 线程eventlet 协程gevent 协程上面就以 『eventlet 协程』 举例子了 from kombu import Connection, Consumer, Queuefrom kombu import Exchange, Queuefrom loguru import loggerfrom kombu.transport.pyamqp import Messageimport timeimport eventleteventlet.monkey_patch()amqp_uri = 'amqp://pon:[email protected]:5672//'flag = 0def handle_message(message: Message): logger.debug(message.body) message.ack()refresh_exchange = Exchange('refresh', type='topic')imdb_queue = Queue('imdb', refresh_exchange, routing_key='to_imdb', durable=True)heartbeat_interval = 5def heartbeat_check_forever(heartbeat_interval: int | float = None): while True: conn.heartbeat_check() logger.debug(f'心跳查看实现') time.sleep(heartbeat_interval/2/2 if heartbeat_interval else 1)with Connection(amqp_uri, heartbeat=heartbeat_interval) as conn: with conn.channel() as channel: consumer = Consumer(channel, queues=[imdb_queue], prefetch_count=10) consumer.on_message(handle_message) with consumer: eventlet.spawn_n(heartbeat_check_forever, heartbeat_interval) while True: conn.drain_events() ...

November 6, 2022 · 1 min · jiezi

关于python:Python-Sqlalchemy-对数据库的批量插入或更新Upsert

本篇承接上一篇《Mysql 数据库的批量插入或更新(Upsert)》的内容,来看看在 Python 中,怎么实现大量数据的 upsert(记录存在就更新,不存在则插入)。 因为不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,减少了 on_duplicate_key_update 办法。 根本用法假如表数据模型如下: class TableA(db.Model): __tablename__ = 'table_a' __table_args__ = (db.UniqueConstraint('a', 'b', name='table_a_a_b_unique')) id = db.Column(db.Integer, primary_key=True) a = db.Column(db.Integer) b = db.Column(db.Integer) c = db.Column(db.Integer)其中 id 是自增主键,a, b 组成了惟一索引。那么对应的 upsert 语句如下:from sqlalchemy.dialects.mysql import insert insert(TableA).values(a=1, b=2, c=3).on_duplicate_key_update(c=3)复用数值跟 SQL 语句相似,咱们能够不必每次都反复填写 insert 和 update 的数值: update_keys = ['c']insert_stmt = insert(table_cls).values(a=1, b=2, c=3)update_columns = {x.name: x for x in insert_stmt.inserted if x.name in update_keys}upsert_stmt = insert_stmt.on_duplicate_key_update(**update_columns)db.session.execute(upsert_stmt)留神,最初一句 on_duplicate_key_update 的参数是须要开展的,不承受 dict 作为参数 ...

November 6, 2022 · 2 min · jiezi

关于python:oeasypython0010helloworldunixc历史迷因

Hello World!回顾上次内容咱们这次设置了断点 设置断点的目标是更快地调试调试的目标是去除 bug别胆怯 bug一步步地总能找到 bug这就是程序员基本功 调试 debug这个bug虫子是有历史渊源的编程也是有历史迷因的 为什么写程序都从hello world开始?为啥总是Hello World 奇怪不管学习什么编程语言 总是从Hello World开始 为什么呢?起源这所有都要从头说起 linux 操作系统的老祖宗 unix和 unix 对应的编程语言 c 那是所有开始的中央两人1969 年,因为所在 at&t 贝尔实验室的 Multics 我的项目失败 鸿鹄之志的两人 Kenneth ThompsonDennis Ritchie 游戏心愿能在 PDP 机器上持续玩一个游戏 这个游戏是 Multics 下的 star travel 为了玩这个游戏 他们想要做一个操作系统 unix为了制作操作系统 他们发明了 c 语言的编译器 过后 c 是他们为了开发 unix 而制作的语言unix 是为了能玩 star travel 而制作的零碎hello world!c 和 unix 只能运行在过后的机器上 没有文档没有书籍甚至没有人晓得 与他们同在 bell 实验室的 Brian Wilson Kernighan a.k.a bwk 开始写 c 语言的相似于文档说明书的货色手稿主体的函数叫做 main函数 ...

November 4, 2022 · 1 min · jiezi

关于python:如何生成炫酷的词云已验证

wordcloud是什么?wordcloud是python的一个第三方库,称为词云也叫做文字云,是依据文本中的词频,对内容进行可视化的汇总,能够用来绘制用户画像。 装置wordcloud这里用conda新建一个环境来演示 conda create --name wordcloud python=3.9.12conda activate wordcloud须要装置4个包 conda install -y -n wordcloud numpyconda install -y -n wordcloud pillowconda install -y -n wordcloud matplotlibconda install -y -n wordcloud wordcloud应用 wordcloudwordcloud库把词云当作一个 WordCloud 对象,所以应用wordcloud能够大抵分为三个步骤 from wordcloud import WordCloudwc= WordCloud() # 1.创建对象: wc.generate("Choose a life of action, not one of oste-ntation.") # 2.加载文本wc.to_file("./word.png") # 3.输入文件 wordcloud 根底实战 指定中文字体,不然会乱码 from PIL import Imagefrom wordcloud import WordCloud, STOPWORDSimport matplotlib.pyplot as pltimport numpy as npwc = WordCloud(background_color="white",# 设置背景色彩 max_words=2000, # 词云显示的最大词数 height=400, # 图片高度 width=800, # 图片宽度 max_font_size=50, #最大字体 stopwords=STOPWORDS, # 设置停用词 font_path='C:/Windows/Fonts/simhei.ttf', # 兼容中文字体,不然中文会显示乱码 )# 生成词云 wc.generate('诗词,是指以古体诗、张三。 亦是汉字文化圈的特色之一。 李四。 诗词是论述心灵的文学艺术,而诗人、赵文,并依照严格韵律要求,用凝练的语言、绵密的章法、王五。') # 此处的text便是分好词的19大文本# 生成的词云图像保留到本地wc.to_file("./result2.png")# 显示图像plt.imshow(wc, interpolation='bilinear')# interpolation='bilinear' 示意插值办法为双线性插值plt.axis("off")# 关掉图像的坐标plt.show() ...

November 2, 2022 · 1 min · jiezi

关于python:如何免安装使用-Python推荐-17-个在线的-Python-解释器

作者:Al Sweigart 译者:豌豆花下猫@Python猫 英文:https://inventwithpython.com/... 转载请保留作者及译者信息! 装置 Python 很容易,但或者你正在用智能手机/平板电脑,在用不容许装置软件的电脑,或者因为其它起因无奈装置 Python。那么,如何通过免装置的形式应用 Python 呢? 本文将介绍 17 个收费的 Python 解释器和交互式 Shell(也称为 REPL),你能够从 Web 浏览器中间接拜访。(译注:国内拜访局部网站不稳固,能够多试试,或者借助其它辅助上网的工具) 基于浏览器的 Python 解释器有一些毛病: 不能应用 open() 函数读写文件,不能建设网络连接。不容许运行长时间的或者消耗大量内存的程序。无奈装置第三方模块,如 NumPy、Pandas、Requests、PyAutoGUI 或 Pygame(只管有些会预装这些模块)。有些 Python 个性可能被禁用了;在应用时须要个别留神。有些服务须要你注册一个收费帐户;如果你不想解决垃圾邮件,能够用 10 Minute Email 创立一次性的邮件帐户。只管有以上毛病,然而用它们来练习编写 Python 代码是足够的。 上面就是 Python 在线服务网站的列表。这不是一篇匆忙整顿的题目党文章;我仔细检查了每一个网站,并依照集体的爱好程序列举进去。 注:本文不蕴含 Pypy、Jython、Nutika、IronPython 等出名的 Python 解释器,因为它们都不是在线服务。想理解这些解释器,可查看:11 个最佳的 Python 编译器和解释器 1、Python Tutor https://pythontutor.com 我最喜爱的基于浏览器的 Python 文件编辑器就是 Python Tutor(Python 导师)。Python Tutor 内置了一个调试器,容许每次执行一行,并查看程序的单步执行状况。不仅如此,它还记录了程序在每一步的状态,因而你也能够后退。这是大多数调试器没有的个性。 Python Tutor 网站还反对 Java 8、Javascript ES6 和 C/C++(应用 GCC 9.3 编译器)。次要的毛病是,程序在运行时会有所限度(因为在后果返回到你的浏览器之前,程序是在它们的服务器上运行的),然而在大多数的练习例子中,你不会遇到什么问题。 ...

November 2, 2022 · 2 min · jiezi

关于python:Numpy索引

整数索引个别模式:arr[frist_dim_index,second_dim_index,...,nth_dim_index]x = np.array([1, 2, 3, 4, 5, 6, 7, 8])print(x[2]) # 3y = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])print(x[2]) # [21 22 23 24 25] # x[2] == x[2,:]print(x[2, 1]) # 22# x[2, 1] == x[2][1]切片索引个别模式:arr[frist_dim_slice,second_dim_slice,...,nth_dim_slice]Dots 索引NumPy 容许应用 ... 示意足够多的冒号来构建残缺的索引列表。 x[1,2,...] 等于 x[1,2,:,:,:]x[...,3] 等于 x[:,:,:,:,3]x[4,...,5,:] 等于 x[4,:,:,5,:]整数数组索引个别模式:arr[frist_dim,second_dim,...,nth_dim]一维数组,一维索引:x = np.array([1, 2, 3, 4, 5, 6, 7, 8])r = [0, 1, 2]print(x[r])# [1 2 3]二维(多维)数组,一维索引:x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])r = [0, 1, 2]print(x[r])# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]]# x[r] 代表除了第零维,其余维度省略,等同于:[(0,:),(1,:),(2,:)]r = [0, 1, 2]c = [2, 3, 4]y = x[r, c]print(y)# [13 19 25]# x[r,c] 所有维度都没有省略,代表找出[(0,2),(1,3),(2,4)]的元素。一维数组,多维索引:x = np.array([1, 2, 3, 4, 5, 6, 7, 8])r = np.array([[0, 1], [3, 4]])print(x[r])# [[1 2]# [4 5]]# x[r],只对第零维进行操作,找出第零维的索引,(0,1)一组,(3,4)一组,形成多维数组多维数组,多维索引:x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])r = np.array([[0, 1], [3, 4]])print(x[r])# [[[11 12 13 14 15]# [16 17 18 19 20]]## [[26 27 28 29 30]# [31 32 33 34 35]]]# x[r],只对第零维进行操作,找出第零维的索引,(0,1)一组,(3,4)一组,形成多维数组# 相当于 [[(0,:),(1,:)][(3,:),(4,:)]]r = np.array([[0, 0], [4, 4]])c = np.array([[0, 4], [0, 4]])y = x[r, c]print(y)# [[11 15]# [31 35]]# 获取[[(0,0),(0,4)][(4,0),(4,4)]] 的元素r = np.array([0,0])c = np.array([[0, 4], [0, 4]])y = x[r, c]print(y)# [[11, 15],# [11, 15]]# 获取[[(0,0),(0,4)][(0,0),(0,4)]] 的元素# 相当于 r = np.array([[0,0],[0,0]]) 播送机制切片 + 索引x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])y = x[0:3, [1, 2, 2]]print(y)# [[12 13 13]# [17 18 18]# [22 23 23]]# 第零维:(0:3) 取走,第一维取出[1,2,2]元素np.take()从指定轴抽取元素x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])r = [0, 1, 2]print(np.take(x, r, axis=0))# [[11 12 13 14 15]# [16 17 18 19 20]# [21 22 23 24 25]]print(np.take(x, r, axis=1))#[[11 12 13]# [16 17 18]# [21 22 23]# [26 27 28]# [31 32 33]]切片索引和整数索引的区别切片索引所生成的数组视图始终是原始数组的子数组;然而整数索引生成的数组不是其子数组,而是新的数组# 切片索引a=np.array([[1,2],[3,4],[5,6]])b=a[0:1,0:1]b[0,0]=2print(a[0,0]==b)#[[True]]# 整数索引a=np.array([[1,2],[3,4],[5,6]])b=a[0,0]b=2print(a[0,0]==b)#False优雅的数组迭代apply_along_axis(func1d, axis, arr)x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])y = np.apply_along_axis(np.sum, 0, x)print(y) # [105 110 115 120 125]y = np.apply_along_axis(np.sum, 1, x)print(y) # [ 65 90 115 140 165]这个中央很容易弄反,二维数据领有两个轴:第 0 轴沿着行的垂直往下,第 1 轴沿着列的方向程度延长。 ...

October 30, 2022 · 2 min · jiezi

关于python:Python编程入门引言

What is Python?Python 是由 Guido van Rossum 工程师于1991年所开发,是一种高级的、解释性的、交互式的通用型编程语言。它被设计成具备高度可读性,是一门动静编程语言,并且具备主动垃圾回收机制。Python反对多种编程范式,其中包含结构化、面向对象和函数式编程。作为一种通用语言,Python 的引入彻底改变了编程的世界。Python 不再像其余动静语言个别仅用于解决具体问题。现如今,Pyhton 已被宽泛地利用于数据迷信、人工智能、网络爬虫等各个领域。深受寰球程序猿的青睐和追捧。截至目前为止,Python 软件基金会已公布到 Pyhton3.10 版本。 动态类型:指运行源程序前需晓得变量类型并查看其正确性,如C++和Java; 动静类型:指运行源程序前无需提前检查和验证每个变量,程序边运行边查看,如Python和PHP。 Why choose Python? Python 语言具备语法简略、疾速调试、易于保护等诸多长处,同时具备高度的可移植性和可扩展性。 简便性Python 的简略语法减少了它的可读性,确保它是最容易学习的编程语言之一。同时,Python 是一门高级语言,其语法特地靠近于英语,特地易于初学者学习。 丰富性Python 领有十分多的第三方库、包以及框架。开发人员能够查找相干的 Pyhton 库一键import即可。例如用于数据迷信的Numpy和Pandas库;用于数据可视化剖析的Matplotlib和Seaborn库;用于机器学习的Pytorch和TensorFlow等等。 灵活性与传统的编程语言如Java和C语言不同,Python 在给变量赋值之前没有严格的变量申明,这使 Python 具备高度的灵活性,其容许变量在执行过程中的不同阶段具备不同的数据类型。另外,开发人员还能够利用Python 来批改或调用其余语言的语法和代码,使其具备可扩展性。 此外,Python 还被宽泛地利用于各个领域。 人工智能因为其稳固、灵便和简洁的性质,Python 被广泛应用于机器学习和人工智能畛域,是数据科学家和机器学习从业者的首选语言之一。 数据分析与AI和ML一样,数据分析和数据迷信畛域也经常能够看到 Python 的身影。目前,人类每天都在发明越来越多的数据,像 Python 这样的高效编程语言在剖析、解决和治理数据方面有微小需要。 网络及游戏开发Python 也同样实用于网络开发和游戏开发畛域。例如,开发人员通常利用 Python 疾速的构建出游戏原型,获得先发劣势。同时,像 Django 和 Flask 这样的网络框架使得在波及到与网络开发无关的工作时,很难不感觉 Python 真香。 当然,Python 在其余畛域也宽泛实用。值得一提的是,Python 相比于其它编程语言所具备的一个显著劣势便是领有一个宏大的用户社区。这表明,无论大家在开发过程中遇到任何问题,在 Python 社区的反对下,99% 的问题都能最终找到解决方案。 How to learn Python?本系列课程旨在帮忙升高老手的入门门槛,同时帮助新手温故而知新,次要借鉴此书和网站内容进行创作来帮忙大家更加迅速、轻松且零碎的学习 Python 这门语言,由入门到精通。后续的系列课程也会波及到与 Python 主题相干的一些内容,包含但不仅限于数据分析、游戏开发和计算机视觉等,感兴趣的小伙伴们也能够关注 Pytrick,咱们将率领大家徜徉在常识的陆地里。 课程的纲要目录如下所示: Python 引言Python 环境搭建Python 根底语法Python 内建函数Python 控制流Python 字符解决Python 列表元组Python 字典汇合Python 高级语法Pyhton 函数编程Python 正则表白Python 文件读写Python 异样解决Python 参数治理Python 面向对象Python 迭代器Python 生成器Python 装璜器 ...

October 29, 2022 · 1 min · jiezi

关于python:Python-datetime-时区转换大坑

背景:从数据库获取了工夫 cursor = db.cursor()cursor.execute('select ts from xxx order by id desc limit 1')data1 = cursor.fetchall()my_time = data1[0][0]my_time 是个 datetime 类型须要和以后工夫作比照 cn_zone = pytz.timezone('Asia/Shanghai')def get_cur_time(): return datetime.datetime.now(cn_zone)# 间接减会报错# can't subtract offset-naive and offset-aware datetimesget_cur_time() - my_time思考转换成 timestamp 再计算大坑开始!my_time 因为开始是个无时区的 datetime,无论用各种办法都无奈扭转其 timestamp 的值。 猜想是其生成的时候,timestamp 曾经确定了,后续无奈扭转。另:转换时区的时候有另一个坑: https://www.cnblogs.com/ajianbeyourself/p/11982529.html上面这样用,会把时区变为 LMT+0806(多八小时零六分) cn_zone = pytz.timezone('Asia/Shanghai')my_time.replace(cn_zone)正确用法:用 datetime 相减,但要用 localize 来纠正 ltime = cn_zone.localize(my_time)# 这样再减就能够了(get_cur_time() - ltime).seconds

October 28, 2022 · 1 min · jiezi

关于python:Ansible-从入门到实战

简介基于python开发,可能实现批量系统配置、程序部署、运行命令等性能的自动化运维工具根本框架 Ansible :运行在地方计算机上;Connection Plugins :连贯插件,次要用于本地与操作端之间的连贯与通信;Host Inventory:指定操作的主机,是一个配置文件外面定义监控的主机;Modules:外围模块、自定义模块等等;Plugins :应用插件来实现记录日志、邮件等性能;Playbooks:执行多任务,通过 SSH 部署模块到节点上,可多个节点也能够单个节点装置sudo apt install -y ansible# 验证装置ansible --versionInventoryAnsible 可能同时对单台或多台机器亦或局部机器操作是通过Inventory 来发现机器Inventory 默认保留在 /etc/ansible/hosts 配置文件中# 主机连贯ansible_connection 连贯到主机的类型,任何可能的连贯插件名称,例如,SSH 协定类型中有:ssh、smart 或 paramiko# 个别连贯ansible_host 连贯的主机名称ansible_port ssh端口号ansible_user 默认 ssh用户名# 具体的 SSH 连贯ansible_ssh_pass ssh明码ansible_ssh_private_key_file ssh应用的私钥文件playbook简介一种格局为yaml的申明式配置文件用于ansible配置主机部署相干的资源(部署机器、部署动作等)根本构造Playbook 是由一个或多个 task 组成一个task外面蕴含若干个模块---- hosts: host1,host2,... # 示意一个或多个主机或组 remote_user: root # 示意近程登录用户名 become: yes # 示意容许权限晋升,而默认提权用户为 root, 如果不心愿以 root 身份执行工作,则要用到另一个关键词 become_user, become_user 决定的是执行工作的用户身份 vars: # 变量的定义 http_port: 80 tasks: # 工作组 - name: Install the package "bc" # 个别一个工作一个name apt: name: bc state: present handlers: - name: restart bc service: name: bc state: restarted...简略上手---- hosts: localhost tasks: - name: test connection ping: # ping 模块...$ ansible-playbook ping.yaml PLAY ***************************************************************************TASK [setup] *******************************************************************ok: [localhost]TASK [test ping] ***************************************************************ok: [localhost]PLAY RECAP *********************************************************************localhost : ok=2 changed=0 unreachable=0 failed=0

October 28, 2022 · 1 min · jiezi

关于python:C调用Python方式之一

Python是AI畛域的最支流的编程语言,没有之一。而利用开发畛域则通常不会选用Python语言。如果遇到利用开发过程中波及AI算法,那就必然要面对跨语言通信的问题。明天来介绍下C#中执行Python脚本的形式之一,当然还有其余形式也能实现。须要装置python安装包和库环境,利用c#命令行,调用.py文件执行 这种办法:通过C#命令行调用.py文件 == 通过python.exe 关上.py文件 他的适用性强,你只有保障你的.py程序可能通过python.exe关上,应用就不会有大问题,同时还有一些须要留神的点。 (1)文件门路不能应用相对路径(例:path = ./文件名 或者path = 文件名 ),会报错,这一块我不分明是否他人没遇到,反正我的话是始终会报这种谬误。 解决办法也很简略,要么用绝对路径,要么导入os库,通过os.path.dirname(__file__)能够失去以后文件的门路,即path = os.path.dirname(__file__) + '\文件名' (2)门路距离须要用/代替\;同时“\”作为输出参数偶然也会有出现异常的状况,起因不明。集体倡议将输出门路参数全副提前替换 (3)不能调用py文件的接口,函数办法 (4)最好在程序前附加异样检测解决(try,exception),便于获取异样(C#调用Python偶然库,或者一些门路会有异样,导致间接运行失败)筹备一个简略的Winform程序和Python脚本。Winform程序如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace CsharpCallPython{ public partial class Form1 : Form { private Process progressTest; public Form1() { InitializeComponent(); } private void btnAdd_Click(object sender, EventArgs e) { try { //string path = Application.StartupPath + @"\CsharpCallPython.py";//py文件门路"; string path= "F:\\study\\mycode\\python\\PythonTest\\flaskdemo\\mypthondemo.py"; int a = Convert.ToInt32(txtA.Text); int b = Convert.ToInt32(txtB.Text); StartTest(path, a, b); } catch (Exception ex) { MessageBox.Show(ex.Message); } } public void outputDataReceived(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { this.Invoke(new Action(() => { this.txtResult.Text = e.Data; })); } } public bool StartTest(string pathAlg, int a, int b) { bool state = true; if (!File.Exists(pathAlg)) { throw new Exception("The file was not found."); return false; } string sArguments = pathAlg; sArguments += " " + a.ToString() + " " + b.ToString() + " -u";//Python文件的门路用“/”划分比拟常见 ProcessStartInfo start = new ProcessStartInfo(); start.FileName = @"D:\Python36\python.exe";//环境门路须要配置好Python的理论装置门路 start.Arguments = sArguments; start.UseShellExecute = false; start.RedirectStandardOutput = true; start.RedirectStandardInput = true; start.RedirectStandardError = true; start.CreateNoWindow = true; using (progressTest = Process.Start(start)) { // 异步获取命令行内容 progressTest.BeginOutputReadLine(); // 为异步获取订阅事件 progressTest.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived); } return state; } }}Python脚本如下: ...

October 27, 2022 · 2 min · jiezi

关于python:python打包技巧彻底解决pyinstaller打包exe文件太大的问题

之前也写过很多的小工具,粉丝敌人们应该都晓得在本公众号内回复任意关键字即可获取以往的工具源码或是exe可执行利用。 【浏览全文】 因为以往发过的小工具根本都是几十MB大小的exe利用,也就没有在意exe太大给大家带来的困扰,明天就筹备来彻底的解决一下这个问题。 其实每次打包的exe的利用过大无非就是两个方面的语言因导致的,一是咱们在开发的代码的过程中为了简便常常应用import *的操作间接导入库中所有的模块。 二是在打包过程中间接应用现有的环境间接利用pyinstaller的命令,导致python的很多规范库和不须要的三方模块被导入。剖析分明起因那就好办了,解决办法必定是有的,那就是pipenv非标准库。 接下来具体看看咱们该如何应用pipenv打出最小的exe的利用,没有装置的话应用pip的形式装置一下即可。 pip install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple/装置实现后,即能够应用pipenv的虚拟环境来进行操作了,失常状况下装置上面的步骤执行pipenv的虚拟环境操作: 建设虚拟环境pipenv install进入虚拟环境(上一步可省略,因为没有虚拟环境的话会主动建设一个)pipenv shell装置须要打包的代码块中应用到的所有的python模块pip install requests pyquery pysimplegui fake_useragent装置pyinstaller模块用于打包pip install pyinstaller应用pyinstaller命令间接开始打包pyinstaller -Fw E:\test014\test4.py 须要留神的是如何物理环境中曾经装置了pyinstaller,在pipenv的虚拟环境中这个命令是能够应用的,然而千万不要这么做须要在pipenv的虚拟环境中再次装置一下否则打进去的exe的利用包还是很大。 这是因为物理环境中原有的pyinstaller曾经关联了很多的python内联模块,导致就算在虚拟环境中打的exe程序包依然十分大的缘故。 另一个须要留神的是在pipenv的须要环境中必须装置好须要打包的代码块中所援用的相干python模块,不然打进去的exe程序包也不能失常运行的。 把握了上述的pipenv虚拟环境的应用以及pyinstaller的应用,咱们都能打出十分小且可用的exe程序包,感激大家的浏览! 【往期精彩】 github上又出新我的项目了,能够轻松实现一键抠图! python做了个自动关机工具【文末获取下载链接】 吐血整顿python数据分析利器pandas的八个生命周期!

October 27, 2022 · 1 min · jiezi

关于python:oeasypython0011-python虚拟机的本质cpu架构二进制字节码汇编语言

程序实质回顾上次内容咱们把python源文件 词法剖析 失去 词流(token stream)语法分析 失去 形象语法树(Abstract Syntax Tree)编译 失去 字节码 (bytecode)字节码咱们看不懂所以反编译 失去 指令文件(opcode) 指令文件是基于python虚拟机的虚构cpu的指令集什么是python虚拟机呢?在理解虚构cpu之前咱们先看看实在的cpu实在的cpu无论手机还是计算机 最外围器件的器件就是cpu 这个货色是个实实在在存在的实体咱们所说的python虚拟机能看到么?就是用来运行py文件的python3 到底是个啥?which python3ll /usr/bin/python3这个 python3 是一个符号链接文件只有9字节他指向 python3.8python3.8 也在 /usr/bin 外面就是/usr/bin/python3.8 python3.8是一个5.3M的文件能够看得见能够间接运行这个phthon3.8吗?间接运行/usr/bin/python3.8python3.8 就在硬盘里呆着 地位就在/usr/bin/python3.8 usr 是 unix software resourcebin 是二进制 binarypython3.8 是这个文件的名称在运行命令的时候 把这个文件从硬盘装载到内存而后用 cpu 开始逐行执行文件中的0101指令能够把他复制到shiyanlou用户的宿主文件夹下吗?复制 复制到shiyanlou下再察看#把/usr/bin/python3这个py文件的解释器拷贝到~(以后用户文件夹)#cp的意思是copycp /usr/bin/python3 ~#确认python3曾经拷到~(以后用户文件夹)#ls的意思是listls ~/python3.8#查看python3文件细节ls -lah ~/python3.8python3 指向的 python3.8 只有 5.3M 这个可执行文件怎么这么小?5.3M 这也就是一张照片的大小以前的 Python3.5 只有 4.3M 更小目前这 5.3M 的 Python3 外面到底有什么呢?钻研 python3#用vi关上这个刚拷贝过去的python3vi ~/python3.8这个样子看起来 全是乱码齐全看不懂啊 这个货色咱们的确看不懂然而有人能看懂谁呢?cpucpu能看懂!!!这些咱们看不懂的乱码 cpu能看懂这是属于cpu的机器语言这就是cpu的一条条的机器指令(instruction) 机器指令码都是二进制模式的咱们尝试把python3.8转化为字节表现形式以字节模式察看python3.8vi ~/python3.8用vim关上~/python3.8 : 进入命令行模式:%!xxd咱们能够看到这个文件的二进制状态 ...

October 27, 2022 · 2 min · jiezi

关于python:python日志logging配置

python日志logging配置为了不便ELK收集日志,将日志打印成json格局开发过程中,应用json格局不不便排查问题本文章应用python的logging模块,一步步减少配置,来阐明每个组件作用原始日志python能够应用两种形式打印python默认打印级别为'WARNING'import logging# 间接应用logging打印日志logging.info('info') # 未打印logging.warning('warning') # WARNING:root:warninglogging.error('error') # ERROR:root:error# 应用logger打印日志logger = logging.getLogger('demo')logger.info('info') # 未打印logger.warning('warning') # WARNING:demo:warninglogger.error('error') # ERROR:demo:error应用字典配置version为固定字段,目前为1将级别设置为'INFO'import loggingimport logging.configdef use_config(): """配置日志行为""" config = {"version": 1, "root": {"level": "INFO"}} logging.config.dictConfig(config)use_config()# 间接应用logging打印日志logging.info('info') # INFO:root:infologging.warning('warning') # WARNING:root:warninglogging.error('error') # ERROR:root:error# 应用logger打印日志logger = logging.getLogger('demo')logger.info('info') # INFO:demo:infologger.warning('warning') # WARNING:demo:warninglogger.error('error') # ERROR:demo:error记录器"loggers"为指定记录器"root"本质上也是记录器,python默认的记录器 logging间接打印日志,相当于logging.getLogger('root')没有找到记录器名字的应用默认记录器(即'root')import loggingimport logging.configdef use_config(): """配置日志行为""" config = { "version": 1, "root": { "level": "WARNING" }, "loggers": { "demo": { "level": "ERROR" } } } logging.config.dictConfig(config)use_config()# 间接应用logging打印日志logging.info('info') # 未打印logging.warning('warning') # WARNING:root:warninglogging.error('error') # ERROR:root:error# 应用logger打印日志logger = logging.getLogger('demo')logger.info('info') # 未打印logger.warning('warning') # 未打印logger.error('error') # ERROR:demo:error# 未找到记录器时,应用'root'记录器logger2 = logging.getLogger('demo2')logger2.info('info') # 未打印logger2.warning('warning') # WARNING:demo2:warninglogger2.error('error') # ERROR:demo2:error处理器及格式化器"handlers"为处理器 ...

October 26, 2022 · 3 min · jiezi

关于python:k哥爬虫普法简历大数据公司被查封个人隐私是红线

我国目前并未出台专门针对网络爬虫技术的法律标准,但在司法实际中,相干裁决已不足为奇,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对实在案例的剖析,旨在进步宽广爬虫工程师的法律意识,通晓如何非法合规利用爬虫技术,警钟长鸣,做一个违法、护法、有准则的技术人员。案情介绍2018年10月,北京市公安局海淀分局警务声援大队接到辖区某互联网公司报案称,发现有人在互联网上抛售疑似为该公司的用户信息。依据这条线索,警方迅速开展调查,巧达科技(北京)有限公司非法窃取信息的犯罪事实逐步浮出水面。2019年3月,巧达科技被查封,涉案员工被警方依法刑事拘留。目前还没有从公开数据中查到此案件的裁决文书。 警方查明,与正规招聘网站的简历由用户本人上传不同,巧达科技的简历数据库全副是通过非法手段爬取而来。“嫌疑人通过利用大量代理IP地址、伪造设施标识等技术手段,绕过招聘网站服务器防护策略,窃取寄存在服务器上的用户数据。”网安总队办案民警李文涛说,从不同网站窃取来的信息被从新合并、排列,重名或是信息不全的信息通过“再比对”后造成残缺的简历和用户画像。 针对爬虫获取简历的伎俩,一位巧达科技前员工通知燃财经,巧达在智联、猎聘等网站上,建设了上千个企业账户,每天拜访智联、猎聘的网站次数百万次,都是机器在模仿人工操作。这位员工称,他去年来到巧达之前,巧达仍然在用爬虫伎俩获取简历。 据悉,巧达科技非法获取的简历超过2亿条。基于这些数据,公司开发了“72招浏览器”,将其简历数据库以13800元每年的价格卖给有需要的企业客户,客户就能够在浏览器上间接调取简历信息。 办案民警介绍,在巧达科技窃取数据过程中,还因传输数据量过大导致报案公司服务器数十次中断服务,影响上千万用户失常拜访,带来重大的经济损失。 据网络上裸露的一份巧达数据给客户的商务单干BP(商业计划书)。这份文件声称:巧达科技旗下有38个B端招聘产品、超过170万招聘者用户,巧达科技数据库有2.2亿自然人的简历、简历累计总数37亿份。此外,巧达科技还有超过10亿份通讯录,并且把握着与此相关的社会关系、组织关系、家庭关系数据。联合简历、通讯录,以及内部获取的超过千亿条其余用户数据,巧达科技自称领有超过8亿自然人的认知数据。也就是说,超过57%的中国人的信息都在巧达科技的数据库外面。 依据文件介绍,巧达科技将这些数据用在教培、保险、招聘等行业,某大型地产公司、某职业教育培训机构、某分类信息网站和几家招聘网站在这份文件里被列为典型案例。数据生意为巧达科技带来了大量支出。2016年,巧达科技全年收入1.2亿元,净利润4800万元;2017年,巧达科技全年收入4.11亿元,净利润1.86亿元,净利润率超过45%。 此外,这份商业计划书中独自有5页来讲述业务合规性,其中展现了数据的获取来源于3个路径,巧达科技自称都是非法获得: 1,自有招聘网站:求职者用户间接受权,包含简历中敏感数据和非敏感数据; 2,招聘工具产品:HR/猎头用户受权,包含简历中敏感数据和非敏感数据; 3,第三方数据源:合作方受权,包含用户ID组合,通讯录,行为标签和偏好画像。 取得数据后,巧达科技将简历中敏感数据、用户ID组合、通讯录进行MD5脱敏,以及简历中非敏感数据、行为标签、偏好画像,一并放入数据库中。数据通过建模计算,联合用户的认知引擎,最初提供给客户。 巧达科技提供的多项服务都指向用户集体,不论是通过自有渠道还是第三方渠道,没有通过用户批准和违反用户志愿的数据交易,都属于擅自利用用户信息并可能进犯隐衷。 反思总结咱们晓得招聘网站,普通用户是无奈查看别人简历的,所以巧达科技建设了上千个企业账户,通过企业账户能看到投递人或网站上全量求职者的残缺简历,这很失常,也齐全非法,重点在于巧达科技通过爬虫技术应用几千个企业账户大批量检索并获取招聘网站上的简历数据,并未经求职者自己批准,将原始数据及其多项未经受权的关联数据合并加工后对第三方凋谢交易且获取巨额利润。 此业务的非法前提:一是,要有求职者自己的受权,即使巧达科技是通过自有招聘入口非法获取求职者的简历,应用用户信息也必须限于求职者投递简历的目标范畴之内。超过为求职者间接举荐工作机会之外的行为都是违反用户志愿,属于擅自利用用户信息并进犯用户隐衷。 二是,巧达科技是从第三方获取求职者的简历数据,第三方既要非法取得求职者的简历,同时须要获得求职者对公开和转售简历的许可,这两个条件不足其一都会导致其获取、购买和再利用求职者简历数据的行为不具备合法性。 咱们还留神到,在巧达科技获取数据过程中,还因爬取的数据量过大导致报案公司的服务器数十次中断服务,影响上千万用户失常拜访,带来重大的经济损失,这和K哥后期的案例《【k哥爬虫普法】程序员183并发爬取官方网站,间接获刑3年?》中介绍的一样,外面的反思总结同样实用于本案例。 个人用户的隐衷数据碰不得,这句话曾经说了千百遍了,更何况求职者简历中蕴含了大量的集体和曾任职企业的隐衷和商业信息。理解规定,敬畏法律,利用爬虫技术获取信息,应该严格遵守相干法律、行政法规、部门规章的规定,否则极易落入“非法获取”公民个人信息的法律危险领域。 还值得一提的是,相似智联、猎聘、boss直聘等波及到求职者个人隐私信息的平台,该当器重对客户信息的爱护工作,boss直聘前段时间因某些起因还被审查过。对于求职者个人用户信息的下载、获取,该当设置严格的权限,对于企业客户的注册该当严格审查,对于后盾大量获取简历的行为该当做好严格监控和反制,官网理当及时染指解决。巧达科技之所以可能在这些平台建设上千个企业账户胡作非为的大批量检索、爬取、下载简历,无疑和平台的监管机制缺漏脱不了关系。

October 26, 2022 · 1 min · jiezi

关于python:Python连续霸榜1年2023该选Java还是Python

前不久,TIOBE颁布了10月的编程语言排行榜,不出意外,Python仍旧占据榜首。(前面几位别离为C、Java、C++)这也是自2021年10月第一次登顶TIOBE以来,Python在TIOBE间断霸榜的一周年。而在另一个热门榜单PYPL编程语言排名榜中,Python也在更早的工夫登顶,并长期盘踞头名。一次两次登顶能够说是机缘巧合,霸榜这么久,曾经足以证实Python的市场足够宽广。Python会始终热门上来吗?Python最终会不会取代其余语言?后端畛域的传统王者Java,和异军突起的Python,到底谁才是最初的赢家?置信很多程序员敌人,在看了这组数据后,会有下面的几个疑难。先说论断。Python很强,而且随同着在人工智能、数据分析、可视化等畛域的广泛应用,Python会变得越来越遍及,甚至有可能成为人手必备的语言!然而,Java在后端畛域深厚的根基,短时间内并不会被Python所撼动,而是会在肯定水平上造成互补的关系。当然,久远来看,技术和时代的改革总是在不经意间产生,咱们无奈预知将来,只能做到系好鞋带。上面咱们来具体聊聊。Python的劣势——Python之所以如此火爆,起因不外乎以下几点:待业范围广,薪资可观据职友集最新9月份的数据显示,北京等一线城市,Python工程师均匀月薪在20K-30K之间,如果是算法工程师等高端岗位,薪资还会更高。从待业范畴看,能够这么说,Python简直能够利用到所有行业里,这也是Python始终受到大家喜爱追捧的起因之一。小白上手快,倒退空间广Python的语法简略,对于从没写过代码的人(0根底)也十分的敌对,不必简单的入门根底,简洁易懂。当然,如果想往Python高级方向进阶,成为业余的Python程序员、技术专家,还是须要去零碎学习去降级的。紧跟AI人工智能潮流Python作为一门迷信语言,它能够编写许多品种的机器库语言。而咱们用Python编写的数据库,因为它具备十分好的兼容性,所以Python在人工智能时代中有着很重要的作用。有以上几点,Python霸榜能够说是瓜熟蒂落,此外,从技术上讲,Python相较于其余编程语言,也有其独特的劣势。Python语言简略,容易上手,运行速度很快。Python收费开源,因为它的开源实质,所以它还具备可移植性。Python反对面向过程的编程,也反对面向对象的编程,艰深一些说,Python能够做任何事件,能够开发任何我的项目。无论是Web程序员开发,还是桌面开发,图像处理等,Python都能够胜任。Python还具备可扩展性、可嵌入性,并且他还有丰盛的库。最重要的一点,Python代码具备极强的可读性,不须要编译成二进制代码。Java与Python,孰胜孰负——大家都晓得,Java是编程界的老大哥,技术曾经十分成熟,不论是在Web还是挪动端,Java都是难以取代的语言,所以也宽泛实用于各个行业。Java同样有许多独有的劣势:功能强大Java这种语言具备面向对象、跨平台、安全性、多线程等特点,这也是Java为什么能成为许多利用零碎的最现实开发语言。利用范畴非常宽泛因为Java的优异个性,使其利用于很多畛域,例如:企业级我的项目:企业管理系统、财务零碎等。网站开发:京东、淘宝等购物网站,安全性要求比拟高的官方网站等。游戏开发:一些爆款游戏开发都是用Java编写的。后端支流,待业前景比拟乐观目前,在各大招聘网站上,Java的招聘需要仍旧是最多的,这一点毋庸置疑。Java的回升空间也很大,从工程师、架构师到CTO、治理岗,这一套成熟的体系,是其余语言很难在短时间内去撼动的。当然,尽管学习Java有很多利好劣势,但也不得不抵赖的是,近几年,Java编程畛域也曾经越来越卷,特地是初中级的Java工程师,竞争曾经异样强烈!这也导致十分多的人萌发了换方向的想法,而Python就是其中之一。毕竟都是后端畛域,也都是性能比拟弱小的编程语言,领有大量专门的社区和大量开发人员反对的库,放在一起作比拟是不免的。特地是在抉择第一门编程语言的时候,置信很多人都有过这样的纳闷,面对Python和Java,那咱们到底要抉择哪个,或者说,先主攻哪一门呢? Python和Java,如何抉择——编程界有一句流传很久的名言,叫“”语言不重要,根底才是要害”。当然,这是一句正确的废话,对于巨佬们来说的,曾经打通任督二脉,任何编程语言拿过去,都如庖丁解牛,天然毫不费力。但对于大部分程序员乃至大学生来说,如何在短时间内,高效的,把握一门语言,并通过这项技能找到称心的工作,拿到称心的薪资,则是,十分重要的!所以,咱们也尽量给到一些中肯的倡议。依照行业划分:随着元宇宙的概念遍及,将来的发展趋势逐步向人工智能、区块链、数字云生等方向倒退,而这些业务都是Python十分善于的,也会有大量的岗位呈现,如果想从事这个行业,大家能够首选学习Python。具体的方向有:Web开发、爬虫、数据分析、人工智能、运维和自动化测试等。而Java这项技术更加偏差于某些服务器级别的工程类我的项目,或者一些利用级别的我的项目,如果想走工程类方向,大家能够首选Java进行学习。对于大学生群体来说:如果是一般院校出身,想尽快找工作,Java 就是一个十分好的抉择。只有根底扎实,语言纯熟,能力强,被 BAT 级别的大厂青眼也是有可能的。学校略微好点的, 211/985 院校的本科生,能够在本科期间就为机器学习、数据挖掘、人工智能相干岗位做筹备,抉择Python,向算法岗方向致力。而对于研究生来说,可选择性比本科大,能够全凭趣味方向,全凭把握(本人掂量算法和开发岗)找工作。对于曾经工作的人来说:如果你曾经入行了Java或者C等岗位,那我也强烈建议你学一下Python,随着将来AI的一直推广,元宇宙产业链的一直实现欠缺,对于Python的相干岗位会越来越多,兴许当前会呈现更多新的机会!最初的总结在编程行业,趣味永远是第一位的,做本人喜爱感兴趣的事件,继续的保持,置信总有一天你肯定会成为这个畛域的专家级人物。当然,在刚工作的时候,熟练掌握一门编程语言,做深、做精,拿到一个称心的报酬,对于大部分人而言也是十分重要的,这时,就须要抉择一个方向,深刻学习一门语言,去开启你璀璨的职业生涯。筒子们,加油吧,咱们都有美妙的将来~

October 25, 2022 · 1 min · jiezi

关于python:kombu-连接池详解

起因应用 nameko 的时候,想看看 nameko 的连贯复用原理(指的是和 rabbitmq 的 amqp 网络连接的复用) 个别连贯复用有两种计划: TLS(Thread Local Storage)连接池第一种计划,实现最简略,然而有局限性。比方应用线程池的状况下才有用,比方应用协程、或者无复用的线程就不适合了 第二种计划,连接池是最通用的计划,但也是最麻烦的计划。 那 nameko 应用的是哪种计划呢?答案是:连接池 好了,既然咱们曾经晓得了这个事实,在深刻这个事实之前,先来理解一下 kombu 的连接池机制吧! kombu 的连接池from kombu import Connectiondef eqhash(o): """Call ``obj.__eqhash__``.""" try: return o.__eqhash__() except AttributeError: return hash(o)amqp_uri = 'amqp://pon:[email protected]:5672//'conn1 = Connection( amqp_uri)conn2 = Connection( amqp_uri)assert eqhash(conn1) == eqhash(conn2)

October 24, 2022 · 1 min · jiezi

关于python:python做了个自动关机工具再也不会耽误我下班啦

上班族常常会遇到这样状况,焦急上班后果将关机正点成重启,或者邻近上班又告诉散会,开完会曾经迟了还要去给电脑关机。 【浏览全文】 明天应用PyQt5做了个自动关机的小工具,设置好关机工夫而后间接提交即可,上班就能够间接走人了。 有间接须要.exe可执行利用的话,间接到文末处获取下载链接! 自动关机小工具也反对了革除曾经设置好的关机工夫,避免曾经设置好了关机工夫从新调整时不晓得怎么调整。 本利用除了应用os的python规范库来设置关机,还引入了PyQt5的桌面利用框架,通过实现主动设置关机命令以及革除操作来实现。 # Importing the QThread, QDateTime, and pyqtSignal classes from the PyQt5.QtCore module.from PyQt5.QtCore import QThread, QDateTime, pyqtSignal# Importing the QIcon and QFont classes from the PyQt5.QtGui module.from PyQt5.QtGui import QIcon, QFont# Importing the QWidget, QLabel, QDateTimeEdit, QPushButton, QFormLayout, and QApplication classes from the# PyQt5.QtWidgets module.from PyQt5.QtWidgets import QWidget, QLabel, QDateTimeEdit, QPushButton, QFormLayout, QApplication# Importing the os, sys, and time modules.import os, sys, time# Importing the images.py file.import images创立CloseCompUI的class类,用来实现自动关机利用的页面布局,将UI相干以及对应的槽函数写到这个类中。 ...

October 24, 2022 · 2 min · jiezi

关于python:python-泛型看这一篇就够了

前言网上对于 python 泛型的介绍切实是太少了,而且都是浅尝辄止 我得整点高级和欠缺点的 首先 python 是一个强类型动静语言 一般来讲动静类型不须要泛型,因为泛型就是让类型动起来,那咱们在这里将啥 『python泛型』呢? 很简略,python 有 typing hint,如果你不写 typing hint,也不介意 ide 给你的类型提醒都是 Any 的话,『泛型』你基本不须要关注。 然而在 2022 年,一个好的 python 开发者,写的所有 python 代码都是要加 typing hint 的,所以,泛型的学习和把握就是火烧眉毛的事件。 第一个例子 —— 关联函数的入参和返回值的类型有这么一个函数 func 函数:参数 value 的类型是 int 或者 float:如果 value 的 type 是 int,就返回 int 类型;如果 value 的 type 是 float,就返回 float 类型。 好了这么一个需要,你会怎么实现?想上面这样: def func(value: int | float) -> int | float: return value然而这样有一个很大的问题,这个函数的意思是:参数 value 的类型是 int 或者 float,返回值是 int 或者 float。并不能形容出『如果 value 的 type 是 int,就返回 int 类型;如果 value 的 type 是 float,就返回 float 类型』 ...

October 23, 2022 · 1 min · jiezi

关于python:oeasypython0010-python虚拟机解释执行py文件的原理

解释运行程序 回顾上次内容咱们这次设置了断点 设置断点的目标是更快地调试调试的目标是去除 bug别胆怯 bug一步步地总能找到 bug这就是程序员基本功 调试 debug我心中还是有疑难 python3 是怎么解释 hello.py 的?纯文本咱们的py文件是一个纯文本文件 关上咱们的guido.py 如果没有就新做一个这外面是一个个的字符print("1982------Guido in cwi")print("1995------Guido in cnri")print("2000------Guido in beopen")print("2005------Guido in google")print("2012------Guido in dropbox")print("2020------Guido in microsoft")python怎晓得如何执行呢?传统文本传统文本的根底也是字符 在字符的根底上组织起篇章构造 字组成词词组成句句组成段段组成章节最初成书tokenize首先把一个个字符组成词剖析一下哪些字能够组成词 术语叫词法剖析(lexical analysis) 把原来的字符流 变成了词的流token(令牌)流 词法剖析之后输入的是一个词(token)的流 啥是token呢?tokentoken 令牌 今人说听我号令 号指的是 号角摔杯为号是一个信号令指的是令牌 急急如律令打五十大板令行禁止怎么把源文件变成一个词(token)流呢?python3模块帮忙手册外面有这个内容这个tokenize是python3的一个模块(module) 具体怎么运行呢?token流 咱们尝试运行 python3 -m tokenize guido.py -m 代表的是 module模块对guido.py进行词法剖析剖析进去的词(token)流什么样子呢?这个词的流怎么了解呢?token流第0行设置了编码格局第1行[0,5)字符是第1行第1个token printprint是一个Name(名字)第1行[5,6)字符是第1行第2个token ((是一个Operator(操作符)第1行[6,30)字符是第1行第3个token "1982------Guido in cwi"这是一个String(字符串)第1行[30,31)字符是第1行第4个token ))是一个Operator(操作符)第1行[31,32)字符是第1行第5个token \n\n是一个NewLine(换行符)换行符意味着第一行完结 第2行...词剖析进去之后呢?组词词剖析进去就是怎么组词的问题 哪些词和哪些词先组合哪些词和哪些词后组合生成一棵形象语法树 AST(Abstract Syntax Tree) 我能看看这棵ast树么?引入ast模块 具体怎么做呢?流程先把这个ast模块导入(import)进来 第一句就是import ast回车之后没有任何报错那就是执行胜利了前面也一样没有报错就是执行胜利了 而后读取guido.py并送到s而后对于s进行语法分析(parse) 再把剖析(parse)的后果进行转储(dump)看起来有点乱 能够清晰一些么?降级Python目前lanqiao.cn下面的python是3.8这个清晰缩进的格局须要在3.9以上实现须要降级sudo apt updatesudo apt install python3.9降级之后就能够应用Python3.9了 ...

October 21, 2022 · 1 min · jiezi

关于python:django全知识要点笔记集合近50页从基础到深入理解django开发第一期

django全常识要点笔记汇合,近50页,从根底到深刻了解django开发(第一期)残缺笔记在这:django全常识要点所有笔记汇合获取 残缺笔记目录: 本期笔记内容Django框架次要内容我的项目创立运行配置文件路由配置 (View)request和response对象 (View)类视图 (View)中间件数据库 (Model)模板(Template)admin站点治理Django介绍 官方网站1.11版英文文档1.11版中文文档Django Book 教程1. 简介Django, **发音为[`daeŋ]**,是用python语言写的开源web开发框架,并遵循MVC设计。劳伦斯出版团体为了开发以新闻内容为主的网站,而开发进去了这个框架,于2005年7月在BSD许可证下公布。这个名称来源于比利时的爵士音乐家DjangoReinhardt,他是一个吉普赛人,次要以演奏吉它为主,还演奏过小提琴等。**由于Django在近年来的迅速倒退,利用越来越宽泛,被驰名IT开发杂志SDTimes评比为2013SDTimes100,位列"API、库和框架"分类第6位,被认为是该畛域的佼佼者。** Django的 **主要目标是简便、疾速的开发数据库驱动的网站。**它强调代码复用,多个组件能够很不便的以"插件"模式服务于整个框架,Django有许多功能强大的第三方插件,你甚至能够很不便的开发出本人的工具包。这使得Django具备很强的可扩展性。它还强调疾速开发和DRY(DoNotRepeatYourself)准则。 Django 特点 比照Flask框架,Django是重量级框架,Django原生提供了泛滥的性能组件,让开发更简便疾速。 数据库ORM反对模板表单认证权限Admin治理站点session机制缓存2. Web MVC模式上个世纪八十年代为Smalltalk语言创造的一种 软 件框架模式,最开始用于Desktop程序开发,当初已被宽泛应用,包含Web开发。MVC: Model-View-Controller 模型-视图-控制器 M: model层,负责 数 据解决,包含对数据的增删改查等操作V: view层,负责 界 面显示C: controller层,负责 逻 辑管制,接管和解决申请,调用model和view核心思想: 分 层,解耦。MVC拆散了 数据处理 和 界面显示 的代码,使得一方代码批改了不会影响到另外一方,进步了程序的扩展性和可维护性。Web 开发中的MVC: 3. Django的MVT模式Django MVT 模式 M: Model, 模 型 与MVC中的M雷同,负责对数据的解决V: View, 视 图 与MVC中的C相似,负责解决用户申请,调用M和T,响应申请T: Template, 模 板 与MVC中的V相似,负责如何显示数据(产生html界面) 阐明: Django 也是MVC框架,但换了一个名字Django follows the MVC pattern closely, however it does use its own logic inthe implementation. Because the "C" is handled by the framework itself ...

October 20, 2022 · 2 min · jiezi

关于python:吐血整理python数据分析利器pandas的八个生命周期

这里从八个pandas的数据处理生命周期,整顿汇总出pandas框架在整个数据处理过程中都是如何解决数据的。 【浏览全文】 也就是从pandas的数据表对象以及数据汇总、数据统计等等直到数据导出的八个处理过程来实现pandas应用的汇总解决。 首先,须要筹备好将python非标准库导入进来,除了pandas之外个别随同数据分析解决应用的还有numpy科学计算库。 # Importing the pandas library and giving it the alias pd.import pandas as pd# Importing the numpy library and giving it the alias np.import numpy as np1、数据表对象(DataFrame) 在pandas的数据分析解决中,次要依赖的是对DataFrame对象的解决来实现数据的提取、汇总、统计等操作。 那么在初始化DataFrame对象的时候有两种形式,一种是间接读取Excel、csv文件获取数据后返回DataFrame数据对象。 # Reading the csv file and converting it into a dataframe.dataframe_csv = pd.DataFrame(pd.read_csv('./data.csv'))# Reading the excel file and converting it into a dataframe.dataframe_xlsx = pd.DataFrame(pd.read_excel('./data.xlsx'))另一种则是须要本人创立DataFrame对象的数据,将字典等类型的python对象间接初始化为DataFrame数据表的模式。 # Creating a dataframe with two columns, one called `name` and the other called `age`.dataframe = pd.DataFrame({"编程语言": ['Java', 'Python', 'C++'], "已诞生多少年": [23, 20, 28]}, columns=['编程语言', '已诞生多少年'])2、数据表(DataFrame)构造信息 ...

October 20, 2022 · 5 min · jiezi

关于python:python-通过-c库利用多核性能的提前条件

家喻户晓,Python本身的字节码在执行的时候因为GIL的机制,是无奈同时利用多CPU的计算资源的;然而对于python封装的C库、并且线程是在C库中创立并保护的、并且线程并不需要callback Python的代码的状况下,还是能利用的多核的并发劣势的。参考:编译ffmpeg以取得极佳性能

October 20, 2022 · 1 min · jiezi

关于python:python进阶知识体系大集合讲解近200页-14-大体系第一期

python进阶常识体系大汇合解说,近200页 14 大体系(第一期).md python进阶常识体系大汇合解说,近200页 14 大体系(第一期)残缺笔记在这: python进阶常识体系大汇合解说笔记汇合 https://blog.csdn.net/m0_7291... 残缺笔记目录: 本期笔记内容:Linux基础知识操作系统学 习指标 可能晓得操作系统的作用*1. 常见的操作系统Windowsmac OSLinuxiOSAndroid2. 操作系统的定义操作系统间接运行在计算机上的 系 统软件, 它是 控 制硬件和支持软件运行的计算机程序。 3. 操作系统的作用向下 控 制硬件向上 支 持软件的运行,具备承前启后的作用。 4. 小结操作系统是一个管制硬件和支持软件运行的计算机程序,只有装置了操作系统计算机能力进行失常工作。 ____ 虚拟机软件学 习指标 可能说出虚拟机的作用*1. 虚拟机软件的介绍它是可能虚构进去计算机的一个软件。 罕用虚拟机软件: VmwareVirtualBox 阐明: 只有装置了虚拟机软件才能够创立虚拟机,当然通过虚拟机软件还能够创立多个虚拟机。 2. 虚拟机的介绍就是模仿一个实在的计算机,好比一个虚构的电脑, 对 于疾速学习一个新的操作系统就能够通过虚拟机来实现。 阐明: 虚拟机之间是互相独立的,删除虚拟机不会对其它虚拟机产生影响,当然也不会对电脑自身生影响 3. 虚拟机软件的装置阐明Windows和Linux下载VMware Workstation版的安装包mac OS下载VMware Fusion版的安装包当对应的安装包下载实现当前双击进行装置就能够了当虚拟机软件装置胜利就能够创立虚拟机了创 建虚拟机效果图 这里须要提前下载一个操作系统镜像文件 而后装置提醒一步步进行装置就能够了。 4. 小结对应疾速学习一个新的操作系统,咱们能够借助虚拟机来实现。虚拟机软件、虚拟机、操作系统它们三者之间的关系: ____ Ubuntu操作系统学 习指标 可能说出Windows和Linux文件目录构造的区别*1. Ubuntu操作系统的介绍Ubuntu操作系统是属于 Linux 操作系统中的一种,它是收费、稳固又能够领有壮丽界面的一个操作系统 ...

October 19, 2022 · 1 min · jiezi

关于python:JS-逆向百例某音-XBogus-逆向分析JSVMP-纯算法还原

申明本文章中所有内容仅供学习交换应用,不用于其余任何目标,不提供残缺代码,抓包内容、敏感网址、数据接口等均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关! 本文章未经许可禁止转载,禁止任何批改后二次流传,擅自应用本文解说的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】分割作者立刻删除! 逆向指标指标:某音网页端用户信息接口 X-Bogus 参数接口:aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvdXNlci9wcm9maWxlL290aGVyLw==什么是 JSVMP?JSVMP 全称 Virtual Machine based code Protection for JavaScript,即 JS 代码虚拟化爱护计划。 JSVMP 的概念最早应该是由西北大学2015级硕士研究生匡开圆,在其2018年的学位论文中提出的,论文题目为:《基于 WebAssembly 的 JavaScript 代码虚拟化爱护办法钻研与实现》,同年还申请了国家专利,专利名称:《一种基于前端字节码技术的 JavaScript 虚拟化爱护办法》,网上能够间接搜到,也可在公众号【K哥爬虫】后盾回复 JSVMP,收费获取原版高清无水印的论文和专利。本文就简略介绍一下 JSVMP,想要具体理解,当然还是倡议去读一下这篇论文。 JSVMP 的外围是在 JavaScript 代码爱护过程中引入代码虚拟化思维,实现源代码的虚拟化过程,将指标代码转换成自定义的字节码,这些字节码只有非凡的解释器能力辨认,暗藏指标代码的要害逻辑。在匡开圆的论文中,利用 WebAssembly 技术实现了非凡的虚构解释器,通过编译暗藏解释器的执行逻辑。JSVMP 的爱护流程如下图所示: 一个残缺的 JSVMP 爱护零碎,大抵的架构应该是这样子的:服务器端读取 JavaScript 代码 —> 词法剖析 —> 语法分析 —> 生成AST语法树 —> 生成公有指令 —> 生成对应公有解释器,将公有指令加密与公有解释器发送给浏览器,而后一边解释,一边执行。 JSVMP 有哪些学习材料?除了匡开圆的论文以外,还有以下文章也值得学习: H5利用加固防破解-js虚拟机爱护计划浅谈JS加密?用虚拟机opcode爱护JS源码给"某音"的js虚拟机写一个编译器JSVMP 逆向办法有哪些?就目前来讲,JSVMP 的逆向办法有三种(自动化不算):RPC 近程调用,补环境,日志断点还原算法,其中日志断点也称为插桩,找到要害地位,输入要害参数的日志信息,从后果往上倒推生成逻辑,以达到算法还原的目标,RPC 技术K哥以前写过文章,补环境的形式当前有工夫再写,本文次要介绍如何应用插桩来还原算法。 抓包状况轻易来到某个博主主页,抓包后搜寻可发现一个接口,返回的是 JSON 数据,外面蕴含了博主某音号,认证信息、签名,关注、粉丝、获赞等,申请 Query String Parameters 里蕴含了一个 X-Bogus 参数,每次申请会扭转,此外还有 sec_user_id 是博主主页 URL 前面那一串,webid 间接申请主页返回内容里就有,msToken 与 cookie 无关,革除 cookie 拜访,就没这个参数了,实测该接口不验证 webid 和 msToken,间接置空即可。 ...

October 19, 2022 · 6 min · jiezi

关于python:oeasypython0009-设置断点breakpoint

调试程序 回顾上次内容py 的程序是依照程序执行的 是一行行挨排解释执行的程序并不是数量越多越好kpi也在一直演变 写的代码越多 呈现的bug就越多那什么是bug呢? 如何找bug呢?尝试调试想要调试程序找bug首先得有一个程序print("1982------Guido in cwi")print("1995------Guido in cnri")print("2000------Guido in beopen")print("2005------Guido in google")print("2012------Guido in dropbox")print("2020------Guido in microsoft")首先要有这个guido.py而后放到网上零碎的剪贴板上 尝试调试粘贴到vim中 原来是一把执行当初能够一步一步调试运行pdb3 guido.py应用pdb来进行调试 pdb的意思是python's debugger为什么要逐渐运行呢?逐渐运行因为程序不晓得哪里出的问题 所以一步步来执行 一步步调试运行的目标是去除bug 也就是debug可是为什么把程序谬误叫做 bug 呢?help不晓得怎么办的时候 就要求助(help) 他给了我很多的命令还说能够help 一下具体 topic查看你哪个topic呢?具体帮忙查看帮忙的帮忙 没有参数的话 显示所有命令有一个参数 显示这个参数的帮忙h(elp) 的缩写是 h elp能够省略 这并不难 h h再看看其余单词listl(ist) 能够列出上下文11行的程序缩写是l 以后行后面有个箭头 ->应用命令 的确能够看到上下文->代表着以后运行到了哪里怎么往下走呢?nextn(ext) 能够往前走一句缩写是n 试一下 把1982年输入了而后以后行来到了1995年如何判断1995年在整个程序中的地位呢?执行l(ist) 能够列出以后行的上下文 在第2行 next就会到第3行当然也能够一路next上来一路next 咱们一路next实现调试一路 next 上来python 解释器就是这么一步步地解释执行的 的确是程序执行的一行行挨排儿执行的咱们就一步步地把bug找进去就像找凶手一样!最实在的解谜游戏debug是我见过最实在的解谜游戏了比什么剧本杀好玩多了一步步地剖析找不到罪魁祸首的时候 须要沉着地剖析找到罪魁祸首的时候那种高兴太实在了!!!!终于来到最初一行如果到这里再next会产生什么呢?最初一步执行完最初一句之后 就会返回(return)到python而后返回(return)到shell 如果这个时候曾经到了程序的止境再next会产生什么呢?绕圈到头了就又重来 就会从新执行这个文件就圜道了 可是这个和虫子(bug)有什么关系呢?第一个谬误 bug 历史上第一个程序谬误是 这只虫子bug飞进继电器(relay)计算机(computer)外面来导致过后的继电器短路所以起初 管谬误叫做bug管调试程序谬误叫做 debug总结py 文件的程序是依照程序 一行行挨排解释执行的咱们能够 pdb3 hello.py 来对程序调试程序执行 ...

October 19, 2022 · 1 min · jiezi

关于python:loguru-添加默认的-extra

翻看了一下 loguru 的源代码 loguru 有很恶心的 pyi 文件来影响咱们看源代码,倡议删除 pyi 后再看。python 删除 pyi 文件能够应用 logger.bind,然而 logger.bind 会返回一个新的 logger,当前都要应用这个新的 logger 才行 ll=logger.bind(project_name="ideaboom")参考文章:How to use Loguru defaults + and extra information?loguru 貌似没有提供原地批改的形式,只能通过这种 logger.bind 生成一个新的 logger 的形式 残缺代码: from loguru._recattrs import RecordExceptionfrom loguru._handler import Handlerfrom loguru import loggerimport sysimport jsonlogger.remove()logger.add(sys.stdout, serialize='json')ll=logger.bind(project_name="ideaboom")ll.debug('哈哈哈')从上面的运行后果,能够看到,extra 中曾经带上 project_name 了 ╰─➤ python -u "/Users/ponponon/Desktop/code/me/ideaboom/test_logger/003.py"{"text": "2022-10-19 09:25:42.082 | DEBUG | __main__:<module>:14 - 哈哈哈\n", "record": {"elapsed": {"repr": "0:00:00.005543", "seconds": 0.005543}, "exception": null, "extra": {"project_name": "ideaboom"}, "file": {"name": "003.py", "path": "/Users/ponponon/Desktop/code/me/ideaboom/test_logger/003.py"}, "function": "<module>", "level": {"icon": "", "name": "DEBUG", "no": 10}, "line": 14, "message": "哈哈哈", "module": "003", "name": "__main__", "process": {"id": 41288, "name": "MainProcess"}, "thread": {"id": 4300178816, "name": "MainThread"}, "time": {"repr": "2022-10-19 09:25:42.082610+08:00", "timestamp": 1666142742.08261}}}为了不便各位看官看,我把这条日志格式化一下 ...

October 19, 2022 · 1 min · jiezi

关于python:python-删除-pyi-文件

不值从何时起,想看某些模块的源码的时候,跳转到的不是 py 文件,而是 pyi 文件。 这太愚昧了,是可忍孰不可忍! 怎么删除呢? 看我操作 首先输出 pip show loguru 就能看到这个 loguru 包在文件系统上的地位 看 Location╰─➤ pip show loguru Name: loguruVersion: 0.6.0Summary: Python logging made (stupidly) simpleHome-page: https://github.com/Delgan/loguruAuthor: DelganAuthor-email: [email protected]License: MIT licenseLocation: /Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packagesRequires: Required-by: 而后进入 Location 对应的门路 cd /Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages如果你只有删除 loguru 上面的 pyi,而不是所有第三方包的 pyi 的话,就要用 cd /Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/loguru而后应用上面的命令,和 pyi 说拜拜 find . -name "*.pyi" | xargs rm -rf

October 19, 2022 · 1 min · jiezi

关于python:python项目适配arm架构国产麒麟系统

装置对应版本python如果零碎装置的python版本和我的项目所需的版本不统一,须要手动下载python二进制包编译装置 获取指定版本python,网址 https://registry.npmmirror.com/binary.html?path=python/比方当初装置python3.6.15版本,上面命令参数须要根据具体python版本而扭转 创立文件夹 $ sudo mkdir /usr/local/python3获取对应版本的压缩包文件 $ cd /usr/local/python3$ sudo wget https://cdn.npmmirror.com/binaries/python/3.6.15/Python-3.6.15.tar.xz解压压缩包之后cd到解压文件夹,会存在一个配置文件configure $ sudo tar -xvf Python-3.6.15.tar.xz执行配置文件,该操作会生成Makefile文件 $ cd /usr/local/python3/Python-3.6.15$ sudo ./configure --enable-optimizations --prefix=/usr/local/python3--enable-optimizations容许进行优化,--prefix指定装置目录 编译,装置 $ sudo make all$ sudo make install上述步骤执行实现之后,/usr/local/python3/bin会装置好对应版本的python和pip可执行文件,当初创立对应的软链接 $ sudo ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3.6$ sudo ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3.6验证装置后果,能够看到pip3.6指向的python版本以及对应地位 $ pip3.6 -Vpip 18.1 from /usr/local/python3/lib/python3.6/site-packages/pip (python 3.6)留神点 因为python的地位是/usr/local/python3,所以在pip装置实现一些库生成的二进制包的可执行文件门路地位是/usr/local/python3/bin/ 比方装置实现celery和uwsgi,所以执行的时候须要执行 /usr/local/python3/bin/celery或者/usr/local/python3/bin/uwsgi psycopg2或者psycopy2-binary的pip依赖谬误报错Error: pg_config executable not found. pg_config是位于postgresql-devel包当中在Debian/Ubuntu系当中须要装置libpq-dev在Centos/Fedora/Cygwin/Babun/Redhat系的零碎当中须要libpq-devel麒麟零碎执行apt install libpq-devlxml的pip依赖谬误报错Error: Please make sure the libxml2 and libxslt development packages are installed ...

October 17, 2022 · 2 min · jiezi

关于python:Python脚本梳理

1、应用PIL、Matplotlib、Numpy对含糊老照片进行修复 # encoding=utf-8import numpy as npimport matplotlib.pyplot as pltfrom PIL import Imageimport os.path# 读取图片img_path = "E:\\test.jpg"img = Image.open(img_path)# 图像转化为numpy数组img = np.asarray(img)flat = img.flatten()# 创立函数def get_histogram(image, bins): # array with size of bins, set to zeros histogram = np.zeros(bins) # loop through pixels and sum up counts of pixels for pixel in image: histogram[pixel] += 1 # return our final result return histogram# execute our histogram functionhist = get_histogram(flat, 256)# execute the fncs = np.cumsum(hist)# numerator & denomenatornj = (cs - cs.min()) * 255N = cs.max() - cs.min()# re-normalize the cumsumcs = nj / N# cast it back to uint8 since we can't use floating point values in imagescs = cs.astype('uint8')# get the value from cumulative sum for every index in flat, and set that as img_newimg_new = cs[flat]# put array back into original shape since we flattened itimg_new = np.reshape(img_new, img.shape)# set up side-by-side image displayfig = plt.figure()fig.set_figheight(15)fig.set_figwidth(15)# display the real imagefig.add_subplot(1, 2, 1)plt.imshow(img, cmap='gray')plt.title("Image 'Before' Contrast Adjustment")# display the new imagefig.add_subplot(1, 2, 2)plt.imshow(img_new, cmap='gray')plt.title("Image 'After' Contrast Adjustment")filename = os.path.basename(img_path)# plt.savefig("E:\\" + filename)plt.show()2、将文件批量压缩,应用zipfile库 ...

October 17, 2022 · 4 min · jiezi

关于python:还是比Selenium好用Python使用Splash访问谷歌获取相应内容

上次讲了一下playwright获取网站的数据。然而吧这个playwright,他究竟是一个自动化调试工具,多多少少会占一点本地的资源。这次的Splash可不一样了,他是部署在服务器上的,能够把负载的资源放在一个甚至多个服务器上,实现在服务器上将想要申请的网站,申请加渲染,把最初的HTML返回给你,让你解析数据。 一、Splash和Splash配置Splash是一个JavaScript的渲染服务,这是一款带有HTTP API的轻量级web浏览器,同时啊他还接入了python3的Twisted and QT5库。Spalsh配置这里介绍下Liunx+Docker的配置,以下几步:装置Docker,保障Docker装置的版本>=17应用Docker拉取镜像启动容器,开启Splash服务 1.Pull the image:  2.    $ sudo docker pull scrapinghub/splash  3.Start the container:      $ sudo docker run -it -p 8050:8050 --rm scrapinghub/splash 配置实现后,在你的浏览器输出服务器地址加端口号8050验证是否胜利:像这样你就胜利了 二、Splash+requests的应用Splash是用Lua语言写的脚本,用Lua语言模仿了浏览器加载的过程,从而返回各种后果,如网页源码,截图等。那怎么配合python应用呢?Splash有一个弱小的接口:execute。此接口能够实现与Lua脚本的对接。当然Splash还有render接口,在此先按下不表,想要理解的话还是请自行查看文档。 1.import requests  2.import json  3.   4.splashUrl = "我的splash地址:8050/execute"  5.def get_splash():  6.    param = {  7.        "timeout": 10,  8.        "url": 'https://www.google.com/',  9.        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",  10.        "lua_source": """  11.           function main(splash, args)  12.               splash:go(args.url)  13.               splash:wait(5)  14.               splash.images_enabled = false  15.               return splash:html()  16.               end  17.            """  18.    }  19.    response = requests.post(url=splashUrl, data=json.dumps(param),headers={"content-type": "application/json"})  20.    print(response.text) 这里是通过requests传参数通过post申请Splash接口,而传递的param参数中不仅有splash的配置,还有lua_source中的Lua脚本。其中这部分就是方才浏览器中关上外面的脚本:splash go申请args传入的url连贯,期待10秒不获取图片,最初返回申请后的html内容: 1.function main(splash, args)  2.  splash:go(args.url)  3.  splash:wait(5)  4.  splash.images_enabled = false  5.  return splash:html()  6.end  其中,在申请execute是的param传参,还能够加上其余的参数,就像外面的timeout就是设置5秒超时,什么get/post申请啦,启动或禁用图片加载啦,禁止或启用js啦都能够加上,详情请自行查问文档哦: 三、Splash+requests的代理配置哎,Python获取内容怎么能少得了代理呢。Splash的代理配置十分的简略,在传参的param加上proxy参数就能够了: 1.param = {  2.    "timeout": 10,  3.    "url": 'https://api.myip.la/en?json',  4.    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",  5.    "proxy":getApiIp(),  6.    "lua_source": """  7.       function main(splash, args)  8.           splash:go(args.url)  9.           splash:wait(5)  10.           splash.images_enabled = false  11.           return splash:html()  12.           end  13.        """  14.}  看到这里的IP地址曾经挂上了。说到代理,我这里应用的是ipidea的代理。稳固高效的代理就像是你获取数据路线上的明灯,如光明里的一束光。即便再被封禁,被拦截,也会带你获取到你想要的数据。:)新用户能够白嫖流量哦。地址:http://www.ipidea.net/我以往应用Splash个别是解决前后端拆散的网页用的,有时候后盾接口获取的json数据并不是咱们想要的内容。在写这篇文章之前,我甚至还感觉Splash只能获取get申请,没想到这个货色还是挺好用的。写了文章之后我也学习了不少货色。最初提一嘴啊,Splash能够多服务器配置负载平衡的,曾经有多个Splash的服务器的状况下,在用一台用公网IP的Nginx的服务器,批改下nginx的配置文件,配置认证就能够应用了。

October 17, 2022 · 1 min · jiezi

关于python:google-protobuf-pb-的三种传输格式

protobuf 的三种传输格局;protobuf 最省带宽和磁盘的序列化字节流格局 Message.SerializeToString() return bytes反序列化, Message.ParseFromString(bytes)通用的json 格局; google.protobuf.json_formatjson_format.MessageToJson(Message,**kwargs) 返回json 后果json_format.Parse(text, Message),text为json格局的pb可视化文本格式; google.protobuf.text_format,print or logging 调用的此办法text_format.MessageToString(Message) 返回text 格局的后果;text_format.Parse(text, message) 将text 后果解析到Pb 的Message;

October 17, 2022 · 1 min · jiezi

关于python:oeasypython0007调试程序debug

调试程序 回顾上次内容py 的程序是依照程序执行的 是一行行挨排解释执行的程序并不是数量越多越好kpi也在一直演变 写的代码越多 呈现的bug就越多什么是bug如何找bug呢?尝试调试那 python 程序到底是怎么一步步解释执行的呢?print("1982------Guido in cwi")print("1995------Guido in cnri")print("2000------Guido in beopen")print("2005------Guido in google")print("2012------Guido in dropbox")print("2020------Guido in microsoft")首先要有这个guido.py而后放到网上零碎的剪贴板上 尝试调试粘贴到vim中 原来是一把执行当初能够一步一步调试运行pdb3 guido.py应用pdb来进行调试 pdb的意思是python's debugger为什么要逐渐运行呢?逐渐运行因为程序不晓得哪里出的问题 所以一步步来执行 一步步调试运行的目标是去除bug 也就是debug可是为什么把程序谬误叫做 bug 呢?help不晓得怎么办的时候 就要求助(help) 他给了我很多的命令还说能够help 一下具体 topic查看你哪个topic呢?具体帮忙查看帮忙的帮忙 没有参数的话 显示所有命令有一个参数 显示这个参数的帮忙h(elp) 的缩写是 h elp能够省略 这并不难 h h再看看其余单词listl(ist) 能够列出上下文11行的程序缩写是l 以后行后面有个箭头 ->应用命令 的确能够看到上下文->代表着以后运行到了哪里怎么往下走呢?nextn(ext) 能够往前走一句缩写是n 试一下 把1982年输入了而后以后行来到了1995年如何判断1995年在整个程序中的地位呢?执行l(ist) 能够列出以后行的上下文 在第2行 next就会到第3行当然也能够一路next上来一路next 咱们一路next实现调试一路 next 上来python 解释器就是这么一步步地解释执行的 的确是程序执行的一行行挨排儿执行的咱们就一步步地把bug找进去就像找凶手一样!最实在的解谜游戏debug是我见过最实在的解谜游戏了比什么剧本杀好玩多了一步步地剖析找不到罪魁祸首的时候 须要沉着地剖析找到罪魁祸首的时候那种高兴太实在了!!!!终于来到最初一行如果到这里再next会产生什么呢?最初一步执行完最初一句之后 就会返回(return)到python而后返回(return)到shell 如果这个时候曾经到了程序的止境再next会产生什么呢?绕圈到头了就又重来 就会从新执行这个文件就圜道了 可是这个和虫子(bug)有什么关系呢?第一个谬误 bug 历史上第一个程序谬误是 这只虫子bug飞进继电器(relay)计算机(computer)外面来导致过后的继电器短路所以起初 管谬误叫做bug管调试程序谬误叫做 debug总结py 文件的程序是依照程序 一行行挨排解释执行的咱们能够 pdb3 hello.py 来对程序调试程序执行 ...

October 17, 2022 · 1 min · jiezi

关于python:kombu-的-pools-中的-connections-到底在干嘛

Connection and Producer Pools 官网文档只能说写的很 low 让咱们本人从代码中发现原理吧 from kombu.pools import connectionsfrom kombu import Connectionuri = 'amqp://guest:[email protected]:5672//'connection = Connection(uri)with connections[connection].acquire(block=True) as conn: assert conn == connection首先这玩意不是一个保险柜 site-packages/kombu/pools.py class Connections(PoolGroup): """Collection of connection pools.""" def create(self, connection, limit): return connection.Pool(limit=limit)connections = register_group(Connections(limit=use_global_limit))site-packages/kombu/pools.py def register_group(group): """Register group (can be used as decorator).""" _groups.append(group) return groupsite-packages/kombu/pools.py class PoolGroup(EqualityDict): """Collection of resource pools.""" def __init__(self, limit=None, close_after_fork=True): self.limit = limit self.close_after_fork = close_after_fork if self.close_after_fork and register_after_fork is not None: register_after_fork(self, _after_fork_cleanup_group) def create(self, resource, limit): raise NotImplementedError('PoolGroups must define ``create``') def __missing__(self, resource): limit = self.limit if limit is use_global_limit: limit = get_limit() k = self[resource] = self.create(resource, limit) return ksite-packages/kombu/utils/collections.py ...

October 16, 2022 · 1 min · jiezi

关于python:kombu-的惰性-connection

kombu 这套货色,到底是在哪里建设 amqp 连贯的 from kombu import Connectionfrom kombu.pools import connectionsconnection = Connection('redis://localhost:6379')with connections[connection].acquire(block=True) as conn: print('Got connection: {0!r}'.format(connection.as_uri()))办法:人肉看代码,手动二分,加 wireshark 抓包 在这里加了一个断言site-packages/kombu/transport/pyamqp.py ╰─➤ python 001.py Traceback (most recent call last): File "/Users/ponponon/Desktop/code/me/test_nameko_for_rabbitmq/001.py", line 11, in <module> conn.connect() File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/connection.py", line 274, in connect c=self._ensure_connection( File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/connection.py", line 436, in _ensure_connection return retry_over_time( File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/utils/functional.py", line 312, in retry_over_time return fun(*args, **kwargs) File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/connection.py", line 880, in _connection_factory self._connection = self._establish_connection() File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/connection.py", line 815, in _establish_connection conn = self.transport.establish_connection() File "/Users/ponponon/.local/share/virtualenvs/test_nameko_for_rabbitmq-Kw9_vVsf/lib/python3.10/site-packages/kombu/transport/pyamqp.py", line 199, in establish_connection assert FalseAssertionError

October 16, 2022 · 1 min · jiezi

关于python:oeasypython0007Guido的简历

Guido的简历 回顾上次内容计算机本身的个性决定 计算机保留传递的是电子而不是原子这就使得存储和散发的老本简直为零在这样的物理根底上 呈现了自由软件静止从rms提出的free software 开始到gnu研发的各种软件自由软件静止之后呈现了开源静止 提倡把源代码凋谢也被大量的商业公司所追随python其实是 一个典型的开源我的项目自由软件标志性的语言是谁制作出了python这个语言呢?Guido荷兰人Guido 最早开发的 python那个时候还没有github 过后 Guido 怎么就想到要发明一个 python 呢?缘起最早 Guido 已经在 CWI 工作 CWI是荷兰的数学与计算机科学国家研究所 这个研究所在钻研一种语言 可能像C语言那样 全面调用计算机的性能接口又能像shell那样 轻松的编程这个语言叫做ABC过后 Guido 在 CWI 参加到 ABC语言 的开发 他将本人所知的所有语言设计常识都倾泻在这个我的项目上只管曾经具备了良好的可读性和易用性Guido白天做abc 早晨做本人的python但ABC语言最终还是没有流行起来 起初Guido去哪里了呢?cnri荷兰的国家钻研核心 Guido汲取了ABC的教训开始了本人的 python语言95 年开源静止还在衰亡的过程中钻研python我的项目的经费是 cnri 出的按理说这python应该算是cnri的倒退Guido 想把他做成开源的 然而没有立场毕竟 cnri 花了钱python 从开始 就是属于Guido的最开始在 cwi 工作写abc 上班摸鱼 改的 python 的 bug到了 cnri 持续做这个甚至让 cnri 出钻研python我的项目的经费 从python的Owner下面 其实能够看到Guido的工作轨迹那这个python到底属于谁呢?Guido 的考量在 python 的 license 外面提到了 cwi 和 cnri过后 python 的次要成员开始探讨 python 应该持续收费开源还是商业 ...

October 15, 2022 · 2 min · jiezi

关于python:kombu-创建优先队列

rabbitmq 外面,不同的队列是不分优先级的,哪怕是 publish 的时候,给 message 带上 priority 也是一个陈设 想让队列反对 priority,就要在创立队列的时候,指定 x-max-priority 你可能会很奇怪,为什么有 x-max-priority,而没有 x-min-priority 是不是?对,没有为什么,就是这么奇葩!from kombu import Exchange, Queueapp.conf.task_queues = [ Queue('tasks', Exchange('tasks'), routing_key='tasks', queue_arguments={'x-max-priority': 10},]用下面的代码,就能创立反对优先级的队列 看到队列的 feature 中,有一个 Pri 就阐明这玩意曾经反对优先级了 参考文档:How to use priority in celery task.apply_asynchttps://www.cnblogs.com/zipon/p/11321061.html

October 14, 2022 · 1 min · jiezi

关于python:collections-has-no-attribute-MutableMapping

AttributeError: module 'collections' has no attribute 'MutableMapping' 那起因是什么呢? DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working也就是说,from collections import Mapping, MutableMapping 这种用法在 python3.10 上曾经被移除了 从 python3.3 开始,就应该应用 from collections.abc import MutableMapping 代替 from collections import Mapping, MutableMapping 在 python3.10 上,彻底移除了 from collections import Mapping, MutableMapping 这种用法

October 14, 2022 · 1 min · jiezi

关于python:最优雅的采集-python-程序的日志方案日志存储篇

不论运行程序的平台是 docker 还是 k8s, 采集日志有两种计划: 计划一:采集程序的规范输入计划二:程序把日志写文件中,而后采集日志文件在先来剖析一下计划一和二的好坏 计划一的害处就是:『多行日志采集』 不论是用『行首正则表达式』还是『json化』都不是优雅的解决方案 『行首正则表达式』,不是所有模块的日志都有固定格局,当然,想要强制统一也有方法;『json化』:没有格式化的 json 是人类不可读的,『json化』不便了程序,然而恶心了程序员的眼睛所以,pass 计划二:没有毛病 我怎么用的:程序,即打印日志到规范输入,又写入日志文件 打印日志到规范输入: 这是给人看到,能够间接应用 docker logs、docker-compose logs、kubectl logs 间接看,不便写入日志文件:应用 loguru 的 serialize='json' 将单条日志写入日志文件所以这些日志输入计划,及满足了程序员间接查看日志,也不便程序的采集。 那具体如何实现呢?间接上代码 from loguru import loggerfrom mark import BASE_DIRimport settingsimport osimport jsonfrom loguru._handler import Handlerfrom loguru._recattrs import RecordExceptionlog_path = BASE_DIR/'logs'if not os.path.exists(log_path): os.makedirs(log_path)def _serialize_record(text: str, record: dict): exception: RecordException = record["exception"] if exception is not None: exception = { "type": None if exception.type is None else exception.type.__name__, "value": exception.value, "traceback": bool(exception.traceback), } serializable = { "text": text, "record": { "extra": record["extra"], }, } return json.dumps(serializable, default=str, ensure_ascii=False) + "\n"Handler._serialize_record = staticmethod(_serialize_record)logger.add( log_path/'run.log', serialize='json', rotation='100 MB', retention=1)最重要的就是上面这段,咱们增加一个日志处理器,用于将日志写到文件中第一个参数指定,写哪里第二个参数指定,用什么格局写,这里用 json,因为这样能够防止『打印堆栈谬误会多行』的问题第三、四个参数指定,示意日志轮换规定,写慢 100 MB,就备份一下,而后从 0MB 从新开始,总共有 1 份 ...

October 14, 2022 · 1 min · jiezi

关于python:python-的-gitignore-长什么样子

默认的 ### Python template# Byte-compiled / optimized / DLL files__pycache__/*.py[cod]*$py.class*.pyc# C extensions*.so# Distribution / packaging.Pythonbuild/develop-eggs/dist/downloads/eggs/.eggs/lib/lib64/parts/sdist/var/wheels/share/python-wheels/*.egg-info/.installed.cfg*.eggMANIFEST# PyInstaller# Usually these files are written by a python script from a template# before PyInstaller builds the exe, so as to inject date/other infos into it.*.manifest*.spec# Installer logspip-log.txtpip-delete-this-directory.txt# Unit test / coverage reportshtmlcov/.tox/.nox/.coverage.coverage.*.cachenosetests.xmlcoverage.xml*.cover*.py,cover.hypothesis/.pytest_cache/cover/# Translations*.mo*.pot# Django stuff:*.loglocal_settings.pydb.sqlite3db.sqlite3-journal# Flask stuff:instance/.webassets-cache# Scrapy stuff:.scrapy# Sphinx documentationdocs/_build/# PyBuilder.pybuilder/target/# Jupyter Notebook.ipynb_checkpoints# IPythonprofile_default/ipython_config.py# pyenv# For a library or package, you might want to ignore these files since the code is# intended to run in multiple environments; otherwise, check them in:# .python-version# pipenv# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.# However, in case of collaboration, if having platform-specific dependencies or dependencies# having no cross-platform support, pipenv may install dependencies that don't work, or not# install all needed dependencies.#Pipfile.lock# PEP 582; used by e.g. github.com/David-OConnor/pyflow__pypackages__/# Celery stuffcelerybeat-schedulecelerybeat.pid# SageMath parsed files*.sage.py# Environments*.env.env.venvenv/venv/ENV/env.bak/venv.bak/# Spyder project settings.spyderproject.spyproject# Rope project settings.ropeproject# mkdocs documentation/site# mypy.mypy_cache/.dmypy.jsondmypy.json# Pyre type checker.pyre/# pytype static type analyzer.pytype/# Cython debug symbolscython_debug/留神,这个默认的会 ignore env 相干的内容,这个自行判断要不要.idea/.vscode/.DS_StorePipfile.lock*.log我个别会手动增加一下内容 ...

October 14, 2022 · 1 min · jiezi

关于python:loguru-过滤不同-level-的日志

loguru 不打印低级别的日志 from loguru import loggerfrom mark import BASE_DIRimport osimport sysimport jsonfrom loguru._handler import Handlerfrom loguru._recattrs import RecordExceptionlog_path = BASE_DIR/'logs'logger.remove()logger.add( sys.stdout, level='DEBUG')logger.debug(f'哈哈')logger.info(f'fin')logger.warning(f'fin')logger.error(f'fin')logger.add 的时候,设置 level 参数就好了 value 要用大写哦 把 level 设为 debug 就是都打印 罕用的日志级别是4个 errorwarninginfodebug比方我心愿输入全部四个级别,就用 level='DEBUG' 输入 info、warning、error,就用 level='INFO' 输入 warning、error,就用 level='WARNING' 输入 error,就用 level='ERROR' 其实这些日志级别,背地都是一个数字,状况越重大的,数字越大 logging/__init__.py CRITICAL = 50FATAL = CRITICALERROR = 40WARNING = 30WARN = WARNINGINFO = 20DEBUG = 10NOTSET = 0参考:应用loguru优雅的输入日志

October 14, 2022 · 1 min · jiezi

关于python:周末自制了一个批量图片水印添加器

前段时间写了个比较简单的批量水印增加的python实现形式,将某个文件夹上面的图片全副增加上水印。 【浏览全文】 明天正好有工夫就做了一个UI利用的封装,这样不须要晓得python间接下载exe的应用程序应用即可。 有须要'批量图片水印增加器'的敌人能够间接跳过到文章开端获取下载方式,下载.exe的可执行利用间接应用即可,上面次要来介绍一下实现过程。 首先,还是老规矩介绍一下在开发过程中须要用到的python非标准库,因为这些库都是之前应用过的。 所以这里就间接导入到代码块中,如果没有的话间接应用pip的形式进行装置即可。 # It imports all the classes, attributes, and methods of the PyQt5.QtCore module into the global symbol table.from PyQt5.QtCore import *# It imports all the classes, attributes, and methods of the PyQt5.QtWidgets module into the global symbol table.from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QTextBrowser, QLineEdit, QPushButton, \ QFormLayout, QFileDialog, QLabel# It imports all the classes, attributes, and methods of the PyQt5.QtGui module into the global symbol table.from PyQt5.QtGui import QIcon, QFont, QTextCursor# It imports the sys module.import sys# It imports the os module.import os# It imports the logger from the loguru module.from loguru import logger# It imports the add_mark function from the marker module in the watermarker package.from watermarker.marker import add_mark以上导入的python库就是在整个UI桌面利用开发过程中须要用到的,实现间接咱们新建UI类PicWaterUI专门用来写一些对于桌面利用的布局。 ...

October 13, 2022 · 3 min · jiezi

关于python:以后字符串中的字符提取校验就用这个了效果不错

家喻户晓,python之所以很不便在肯定水平上是因为随时都可能有人又创作了一个好用又不便的python非标准库。 【浏览全文】 正好有一个小需要须要校验一个python字符串中是否存在某种类型的字符,需要其实不难然而本人写的话又要耗时费劲,可能还存在BUG须要测试。 于是想找找看有没有大佬曾经实现这样的python非标准库,还真给找到了就是-txdpy,先装置起来吧,的确比拟不便给大佬递茶! pip install txdpy -i https://pypi.tuna.tsinghua.edu.cn/simple/装置实现之后将txdpy导入到咱们的代码块中,对罕用的函数进行测试执行是否可能实现咱们的惯例逻辑解决。 # Importing the txdpy module and renaming it to tx.import txdpy as txfrom loguru import logger# A string that is used to test the functions in the txdpy module.common_str = '[email protected] 集中营.'def is_num(): """ It returns True if the input is a number, and False otherwise """ # A logging statement. logger.info('是否纯数字字符串:{0}'.format(tx.is_num(common_str)))# It returns True if the input is a number, and False otherwise.is_num()后果执行之后以外状况产生了,顺次报错没有导入上面的三个模块。阐明在咱们的txdpy模块中调用了上面的三个模块,没有关系,若是没有装置上面三个模块的话装置一下即可。 ...

October 12, 2022 · 2 min · jiezi

关于python:python-web-Django京东华为手机商品信息采集爬虫与数据分析

   博主介绍:✌退职Java研发工程师、专一于程序设计、源码分享、技术交换、专一于Java技术畛域和毕业设计✌ 项目名称 python web Django京东华为手机商品信息采集爬虫与数据分析 视频演示 视频去哪了呢?_哔哩哔哩_bilibili 技术栈 后端:Spring+SpringMVC+Mybatis前端:JSP+CSS+JavaScript+jQuery应用阐明 应用Navicat或者其它工具,在mysql中创立对应名称的数据库,并导入我的项目的sql文件;应用IDEA/Eclipse/MyEclipse导入我的项目,Eclipse/MyEclipse导入时,若为maven我的项目请抉择maven;若为maven我的项目,导入胜利后请执行maven clean;maven install命令,而后运行;将我的项目中springmvc-servlet.xml配置文件中的数据库配置改为本人的配置;运行我的项目,在浏览器中输出http://localhost:8080/ 登录运行截图 编辑 编辑  用户管理控制层: package com.houserss.controller; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody; import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo; /** Created by admin */@Controller@RequestMapping("/user/")public class UserController { @Autowiredprivate IUserService iUserService;/** * 用户登录 * @param username * @param password * @param session * @return */@RequestMapping(value = "login.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> login(User user,String uvcode, HttpSession session){ String code = (String)session.getAttribute("validationCode"); if(StringUtils.isNotBlank(code)) { if(!code.equalsIgnoreCase(uvcode)) { return ServerResponse.createByErrorMessage("验证码不正确"); } } ServerResponse<User> response = iUserService.login(user.getUsername(),user.getPassword()); if(response.isSuccess()){ session.setAttribute(Const.CURRENT_USER,response.getData()); } return response;}} ...

October 12, 2022 · 4 min · jiezi

关于python:pipenv-报错-module-collections-has-no-attribute-MutableMapping

这个问题很简略,因为 apt 装置的 pipenv 版本太老了,用最新的 pipenv 版本就好了,怎么取得最新的 pipenv 版本?间接用 pip 装置! 解决办法: 办法一:应用自带的 pip 装置最新的 pipenv ,比方 ubuntu20 是自带的 pip3.8 能够装置,用命令 pip3 install pipenv 就好了办法二:应用本人编译装置的 python 带的 pipenv 就好了ubutu20 自带的 python 解释器是 python3.8 ╰─➤ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 20.04.5 LTSRelease: 20.04Codename: focal我想装置一个 pipenv 来虚构环 python3.10 python3.10 是通过源码自行编译装置的,参考:Ubuntu20.04 从源代码编译装置 python3.10 通过上面的代码装置 pipenv sudo apt install pipenv而后创立虚拟环境 pipenv install --python=/home/pon/opt/python/cpython/python3.10/bin/python3.10 然而遇到了谬误 ╰─➤ pipenv install --python=/home/pon/opt/python/cpython/python3.10/bin/python3.10 130 ↵Virtualenv already exists!Removing existing virtualenv…Creating a virtualenv for this project…Using /home/pon/opt/python/cpython/python3.10/bin/python3.10 (3.10.7) to create virtualenv…⠋created virtual environment CPython3.10.7.final.0-64 in 816ms creator CPython3Posix(dest=/home/pon/.local/share/virtualenvs/tracksource-XXsh2Vxq, clear=False, global=False) seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, pkg_resources=latest, via=copy, app_data_dir=/home/pon/.local/share/virtualenv/seed-app-data/v1.0.1.debian.1) activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivatorVirtualenv location: /home/pon/.local/share/virtualenvs/tracksource-XXsh2VxqPipfile.lock not found, creating…Locking [dev-packages] dependencies… from . import utils File "/usr/lib/python3/dist-packages/pipenv/vendor/requests/utils.py", line 27, in <module> from .cookies import RequestsCookieJar, cookiejar_from_dict File "/usr/lib/python3/dist-packages/pipenv/vendor/requests/cookies.py", line 172, in <module> class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping):AttributeError: module 'collections' has no attribute 'MutableMapping'解决办法还是什么呢? ...

October 11, 2022 · 2 min · jiezi