首页
关于
友链
Search
1
ESXI 一些功能调整
651 阅读
2
天翼云网关3.0/4.0超管密码
579 阅读
3
SoftEther 客户端篇
554 阅读
4
SoftEther 服务端篇
464 阅读
5
远程桌面rustdesk使用说明
411 阅读
奇思妙想
代码相关
软件分享
游戏分享
游戏相关
我的家庭影院
登录
Search
标签搜索
python
esxi
git
SoftEther
linux
apscheduler
在线
rclone
飞牛
list
列表
idm
激活码
Charles
pdf
免安装
鲁大师
图片查看器
蜂蜜浏览器
honeyview
哥特式
累计撰写
112
篇文章
累计收到
15
条评论
首页
栏目
奇思妙想
代码相关
软件分享
游戏分享
游戏相关
我的家庭影院
页面
关于
友链
搜索到
94
篇与
的结果
2022-08-26
git提交流程
git代码提交流程一.git提交代码简单流程第一步,找到代码仓库地址 拉去项目代码git clone ssh://地址路径,最后用http的地址,而不用ssh路径,http分配的才是自己账号使用的代码分支第二步:如果首次拉去,会输入git账号,首次登录之后,后面就不需要做任何操作了第三步:git add . 把代码提交到缓存区第四步:git commit -m "备注" 提交代码第五步:把代码合并到远程分支中去 git push (origin test)如果没有填,就是推送到默认分支,一般在退文件的时候,最后先拉去一下代码 git pull 把分支合并到主支假如我们现在在test分支上,刚开发完项目,执行了下列命令git add .git commit -m ‘test'git push -u origin test然后我们要把dev分支的代码合并到master分支上 该如何?二.首先切换到master分支上1.git checkout master2.git pull origin master如果是多人开发的话 需要把远程master上的代码pull下来3.git merge test如果是自己一个开发就没有必要了,为了保险期间还是pull然后我们把test分支的代码合并到master上4.git status然后查看状态两个位置冲突了git checkout routes/listing.php 处理冲突文件listing处理冲突文件需要合并文件,把在提交代码的时候处理上面的意思就是你有12个commit,需要push到远程master上 执行下面命令即可5.git push origin master这样就可以了需求单独创建分支在创建之前先 git pull 拉去最新项目代码git checkout -b dev 每次创建独立分支2)创建并切换到新的分支中:命令:git checkout –b 分支名称从图中可以看出,执行命令前,我们处于master分支中,执行命令后,我们直接在dev1分支中了。3)删除本地分支和原地分支: 我现在在dev20181018分支上,想删除dev20181018分支 1 先切换到别的分支: git checkout dev20180927 2 删除本地分支: git branch -d dev20181018 3 如果删除不了可以强制删除,git branch -D dev20181018 4 有必要的情况下,删除远程分支(慎用):git push origin --delete dev20181018 5 在从公用的仓库fetch代码:git fetch origin dev20181018:dev20181018 6 然后切换分支即可:git checkout dev20181018 注:上述操作是删除个人本地和个人远程分支,如果只删除个人本地,请忽略第4步6.代码回滚git log # 得到你需要回退一次提交的commit idgit reset --hard <commit_id> # 回到其中你想要的某个版或者git reset --hard HEAD^ # 回到最新的一次提交创建一个ssh密钥ssh-keygen -t rsa -C "Git邮箱地址"使用方式,git忽略文件1. 本地有,服务器没有可以用.gitignore文件2. 如果文件已经在服务器上这时候,就需要使用git update-index --skip-worktree命令了。该命令的作用是,让git在搜索文件列表时,忽略某个文件,这样该文件即使有修改,git也不会关心。git update-index --skip-worktree go.mod使用这个命令,时间久了,可能会忘记自己忽略过哪些文件,这时候可以使用git ls-files -v . | grep "^S"命令找出来忽略过的文件。#例子: git ls-files -v . | grep "^S" #输出:S go.mod不想继续忽略该文件时,使用git update-index --no-skip-worktree命令,来让git不再忽略该文件。git update-index --no-skip-worktree go.mod注:grep命令win上没有,需要下载一个文件http://gnuwin32.sourceforge.net/packages/grep.htm下载下来是一个grep-2.5.4-setup.exe进行安装,记住你的安装路径(比如我是:C:\Program Files (x86)\GnuWin32\bin ),之后加入到path环境变量git多用户配置.ssh目录下配置configHost github.com User zzz IdentityFile ~/.ssh/id_rsa_github PreferredAuthentications publickey Host gitlab.mygitlab.com User zzz2 IdentityFile ~/.ssh/id_rsa_giteeHost: 仓库网站的域名User: Git的账号用户名IdentityFile: 私钥的绝对路径 (自己的ssh key的文件)PreferredAuthentications 配置登录时用什么权限认证
2022年08月26日
58 阅读
0 评论
0 点赞
2022-08-25
windows命令
[toc]{tabs}{tabs-pane label="查看端口情况"}1. Windows查看所有的端口点击电脑左下角的开始,然后选择运行选项,打开“运行”窗口(使用“win+r”键来打开),输入【cmd】命令,进行命令提示符。然后我们在窗口中输入【netstat -ano】按下回车,即会显示所有的端口占用情况。2. 查询指定的端口占用在窗口中,继续输入【netstat -ano|findstr "提示的端口"】,例如小编提示的端口为2080,那么小编就输入命令为【netstat -ano|findstr "2080"】,回车之后就可以看见列表中的PID,然后根据PID在电脑的任务管理器中查看对应的占用程序,接着进行关闭即可。3. 查询PID对应的进行进程如果在上面步骤之后,我们得到的PID为2016,那么我们就可以输入命令【tasklist|findstr "2016"】,在第一行显示的名字就是程序名,这样我们就明白是那个程序占用的端口。4. 然后我们输入命令【taskkill /f /t /im 程序名】即可。{/tabs-pane}{tabs-pane label="刷新dns缓存"}ipconfig /flushdns{/tabs-pane}{/tabs}
2022年08月25日
127 阅读
0 评论
0 点赞
2022-08-24
Django orm 使用case when排序
from django.db.models import Case, When # 先取出商品id和销量 ratings_tuples = [(r.id, r.sales) for r in Product.objects.filter()] # 根据销量降序排序 ratings_list = sorted(ratings_typles, key=lambda x: x[1], reverse=True) print ratings_list [(20L, 1000L), (2187L, 503L), (7715L, 483L), (7711L, 430L), (7720L, 421L), (7717L, 353L), (7719L, 352L), (7712L, 344L), (883L, 300L), (7718L, 276L), (7716L, 219L), (1935L, 110L), (592L, 100L), (3293L, 65L), (2439L, 56L), (7671L, 50L), (1597L, 30L), (7705L, 30L), (777L, 20L), (2292L, 20L), (1563L, 19L), (7706L, 18L), (2L, 16L), (7012L, 16L), (1255L, 12L), (15L, 11L), (1183L, 11L), (3101L, 11L), (7710L, 11L), (59L, 10L), (1256L, 10L), (4029L, 10L), (5831L, 10L), (7241L, 10L), (1L, 9L), (50L, 9L), (1933L, 9L), (2613L, 8L), (18L, 7L), (524L, 6L), (1934L, 6L), (221L, 5L), (1601L, 5L), (1702L, 5L), (1855L, 5L), (5195L, 5L), (7073L, 5L), (7709L, 5L), (7L, 4L), (695L, 4L), (1018L, 4L), (2303L, 4L), (2674L, 4L), (3671L, 4L), (4435L, 4L), (7669L, 4L), (264L, 3L), (589L, 3L), (2526L, 3L), (5115L, 3L), (5305L, 3L), (7616L, 3L), (7695L, 3L), (17L, 2L), (77L, 2L), (770L, 2L), (1474L, 2L), (1591L, 2L), (1961L, 2L), (2763L, 2L), (3670L, 2L), (4434L, 2L), (7479L, 2L), (3L, 1L), (5L, 1L), (16L, 1L), (19... # 将排序后的id放在一个列表里面 pk_list = [idx for idx, sales in ratings_list] # 根据这个id进行case when的排序 preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)]) query = Product.objects.filter(pk__in=pk_list).order_by(preserved)
2022年08月24日
118 阅读
0 评论
1 点赞
2022-08-08
markdown操作
1. Markdown扩展语法之任务清单任务列表使您可以创建带有复选框的项目列表。在支持任务列表的Markdown应用程序中,复选框将显示在内容旁边。要创建任务列表,请在任务列表项之前添加破折号(-)和方括号,并[ ]在其前面加上一个空格()。要选择一个复选框,请x在方括号([x])之间添加in 。- [x] Write the press release - [ ] Update the website - [ ] Contact the media
2022年08月08日
232 阅读
0 评论
0 点赞
2022-07-26
apscheduler cron定时任务触发接口
from apscheduler.schedulers.blocking import BlockingScheduler class Timing: def __init__(self, start_date, end_date, hour=None): self.start_date = start_date self.end_date = end_date self.hour = hour def cron(self, job, *value_list): """cron格式 在特定时间周期性地触发""" # year (int 或 str) – 年,4位数字 # month (int 或 str) – 月 (范围1-12) # day (int 或 str) – 日 (范围1-31) # week (int 或 str) – 周 (范围1-53) # day_of_week (int 或 str) – 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun) # hour (int 或 str) – 时 (范围0-23) # minute (int 或 str) – 分 (范围0-59) # second (int 或 str) – 秒 (范围0-59) # start_date (datetime 或 str) – 最早开始日期(包含) # end_date (datetime 或 str) – 分 最晚结束时间(包含) # timezone (datetime.tzinfo 或str) – 指定时区 scheduler = BlockingScheduler() scheduler.add_job(job, 'cron', start_date=self.start_date, end_date=self.end_date, hour=self.hour, args=[*value_list]) scheduler.start() def interval(self, job, *value_list): """interval格式 周期触发任务""" # weeks (int) - 间隔几周 # days (int) - 间隔几天 # hours (int) - 间隔几小时 # minutes (int) - 间隔几分钟 # seconds (int) - 间隔多少秒 # start_date (datetime 或 str) - 开始日期 # end_date (datetime 或 str) - 结束日期 # timezone (datetime.tzinfo 或str) - 时区 scheduler = BlockingScheduler() # 在 2019-08-29 22:15:00至2019-08-29 22:17:00期间,每隔1分30秒 运行一次 job 方法 scheduler.add_job(job, 'interval', minutes=1, seconds=30, start_date=self.start_date, end_date=self.end_date, args=[*value_list]) scheduler.start() @staticmethod def date(job, *value_list): """date格式 特定时间点触发""" # run_date (datetime 或 str) - 作业的运行日期或时间 # timezone (datetime.tzinfo 或 str) - 指定时区 scheduler = BlockingScheduler() # 在 2019-8-30 01:00:01 运行一次 job 方法 scheduler.add_job(job, 'date', run_date='2019-8-30 01:00:00', args=[*value_list]) scheduler.start()
2022年07月26日
125 阅读
0 评论
0 点赞
2022-07-25
Django中的ORM操作之高级查询aggregate和annotate方法
[Django]中的ORM操作之高级查询aggregate和annotate方法aggregate()方法详解annotate()方法详解aggregate和annotate应用场景Django中使用原生SQLaggregate()方法详解aggregate的中文意思是聚合,源于SQL的聚合函数,Django的aggregate()方法作用是对一组值 (比如queryset的某个字段)进行统计计算,并以字典(Dict)格式返回统计计算结果。django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM等。annotate()方法详解annotate的中文意思是注释,一个更好的理解是分组(Group By)。如果你想要对数据集先进行分组然后再进行某些聚合操作或排序时,需要使用annotate方法来实现。与aggregate方法不同的是, annotate方法返回结果的不仅仅是含有统计结果的一个字典,而是包含有新增统计字段的查询集(queryset) 。values或者values_list 放在annotate前面: 表示values或values_list是声明以什么字段分组,annotate执行分组。values或者values_list放在annotate后面: annotate表示直接以当前表的pk执行分组, values或者values_list表示查询那些字段, 并且要将annotate里的聚合函数起别名, 在values或者values_list里面写其别名。res = Publish.objects.values("name").annotate(in_price = Min("book__price")) # 先以出版社的名字进行分组, 然后再使用聚合函数查询到每个出版社里面最便宜的书籍aggregate和annotate应用场景Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,可以大大提升数据库查询效率。当你需要对查询集(queryset)的某些字段进行聚合操作时(比如Sum, Avg, Max),请使用aggregate方法。如果你想要对数据集先进行分组(Group By)然后再进行某些聚合操作或排序时,请使用annotate方法。Django中使用原生SQL我一开始想图简化,就不想用sql,于是转战django中的orm,结果今天卡住了,想半天想不出来怎么转,又回到了sql,所以说啊,不要偷懒,不然会很痛苦的,血的教训!那么问题来啦,Django中怎么使用原生Sql呢?首先我现在的需求是,查询每一个类别的文章的总数目、总访问量、总评论量以及每一个作者的文章的总数目、总访问量、总评论量,对应的sql语句如下:select category_id,count(id),sum(total_views),sum(comments) from tb_article group by category_id; select author_id,count(id),sum(total_views),sum(comments) from tb_article group by author_id;在Django中执行原生sql的操作如下:# 查询各个类别、各个作者的文章的总数量、总访问量、总评论量 try: # 创建连接 conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='wxm20010428', db='blog', charset='utf8') # 创建游标 cursor = conn.cursor() # 原生sql语句 注意多条sql语句执行时的写法 sql1 = 'select category_id,count(id),sum(total_views),sum(comments) from tb_article group by category_id;' sql2 = 'select author_id,count(id),sum(total_views),sum(comments) from tb_article group by author_id;' # 执行SQL cursor.execute(sql1) result1 = cursor.fetchall() for r1 in result1: print(r1) # 完成sql1的查询 cursor.execute(sql2) result2 = cursor.fetchall() for r2 in result2: print(r2) # 完成sql2的查询 cursor.close() conn.close() except Exception as e: print("Error%d: %s" % (e.args[0], e.args[1]))
2022年07月25日
118 阅读
0 评论
0 点赞
2022-07-18
python async 使用,介绍
程序在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞,而协程作为一种用户态的轻量级线程,可以帮我们解决这个问题说人话:说白了就是,当协程遇到io操作而阻塞时,立即切换到别的任务,如果操作完成则进行回调返回执行结果,提高了效率,同时这样也可以充分利用 CPU 和其他资源,这就是异步协程的优势,并且协程本质上是个单进程,相对于多进程来说,无需进程间上下文切换的开销,无需原子操作锁定及同步的开销,编程模型也非常简单。async/await 是python3的新特性,可以进行协程运行。个人将他理解成多线程。实现代码如下import time import asyncio async def SleepTime(ts): if ts == 3: await asyncio.sleep(10) #当ts等于3的时候,让挂起的时间为10s,其他的按正常挂起,验证协程时间。 else: await asyncio.sleep(ts) async def main(loop): tasks = [] for i in range(6): print("time begin %s"%i) tasks.append(loop.create_task(SleepTime(i))) #相当于开启了一个线程 print("sleep time end %s"%i) print("*********************") await asyncio.wait(tasks) #等待所有的任务完成。 if __name__ == "__main__": # main() print("begin test") tb = time.time() print(tb) #记录当前时间 loop = asyncio.get_event_loop() loop.run_until_complete(main(loop)) loop.close() print(time.time()-tb) #记录结束时间 print("end")` 运行结果如下,没有用到协程的结果,会依次执行,总耗时会大于10秒。begin test 1602423299.3981705 time begin 0 sleep time end 0 ********************* time begin 1 sleep time end 1 ********************* time begin 2 sleep time end 2 ********************* time begin 3 sleep time end 3 ********************* time begin 4 sleep time end 4 ********************* time begin 5 sleep time end 5 ********************* 10.005681276321411 end [Finished in 10.2s]
2022年07月18日
250 阅读
0 评论
0 点赞
2022-07-08
git 放弃本地修改,强制拉取更新
git 放弃本地修改,强制拉取更新git 放弃本地修改,强制拉取更新开发时,对于本地的项目中修改不做保存操作(或代码改崩),可以用到Gitpull的强制覆盖,具体代码如下:gitfetch–allgitreset–hardorigin/mastergitpull//可以省略gitfetch指令是下载远程仓库最新内容,不做合并gitreset指令把HEAD指向master最新版本大家好,又见面了,我是你们的朋友全栈君。开发项目时,对于本地已修改但又不想保留的代码(比如你代码改崩了),可以用如下两种方法来重置代码:1、restore 重置如果你修改了代码,但是并未执行 git add 操作,可直接执行:git restore . . 表示所有文件,如果想重置个别文件,指定文件路径即可git restore <文件>... 注意:如果你已经执行了 git add 操作,此时代码已保存至暂存区,需要先取消暂存区变更:git restore --staged . 或者git reset . 然后,再执行 git pull 拉取远程代码同步即可。2、reset 回退reset 比较暴力,相当于 可适用于 代码在工作区、暂存区、仓库区等任何场景,重置后不可恢复,对于新手有一定的安全隐患。git fetch --all git reset --hard origin/master git pull // 这一步为了同步远程代码,不需要的话可不执行 git fetch 指令是下载远程仓库最新内容,不做合并。git reset 指令把HEAD指向master最新版本。reset –hard:重置后不保留暂存区和工作区reset –soft:保留工作区,并把重置 HEAD 所带来的新的差异放进暂存区(此时代码的变更状态相当于执行完 git add命令)reset –mixed:reset的默认参数,保留工作目录,并重置暂存区(此时代码的变更状态相当于执行 git add命令之前)3、stash 暂存(推荐)我比较喜欢的方法,是用stash,暂存代码再同步。首先,将所有代码添加至暂存区:git add . 然后,将代码临时保存:git stash 此时代码会重置到修改前的状态,可以同步远程仓库区,完事儿。git pull 同步后,如果还想继续修改原来的代码,可将临时代码恢复至工作区:git stash pop 注意,stash 用法有很多,比如save,push,pop,clear等,需要使用可以查阅stash 命令
2022年07月08日
63 阅读
0 评论
0 点赞
2022-06-21
Linux下使用rclone挂载网盘到本地
Linux下使用rclone挂载网盘到本地Rclone是一个支持挂载多数国外网盘的工具。Rclone官网传送们目前Rclone支持挂载的网盘有:Google Drive、 Dropbox 、Google Cloud Storage 、Microsoft One Drive 、Hubic、 Backblaze B2 、Yandex Disk 、Openstack Swift / Rackspace cloud files / Memset Memstore 等。更强大的是,Rclone还支持SFTP 、FTP 、HTTP挂载。配置步骤(以Ubuntu为例)第一步:安装rclone 1. 方法一:rclone一键安装脚本 2. curl https: 4. 方法二: 5. wget https: 第二步:授权(以onedrive为例)rclone authorize "onedrive"会出现以下信息: 1. 2018/01/23 20:28:56 NOTICE: Config file "C:\\Users\\Administrator\\.config\\rclo 2. ne\\rclone.conf" not found - using defaults 3. Choose OneDrive account type? 4. * Say b for a OneDrive business account 5. * Say p for a personal OneDrive account 6. b) Business 7. p) Personal 8. b/p> p 9. If your browser doesn't open automatically go to the following link: http://127. 10. 0.0.1:53682/auth #接下来会弹出浏览器,要求你登录账号进行授权 11. Log in and authorize rclone for access 12. Waiting for code... 13. Got code 14. Paste the following into your remote machine ---> 15. {"access_token":"xxxx"} #请复制{xx}整个内容,后面需要用到 16. <---End paste 第三步:配置(链接网盘,以onedrive为例)rclone config会出现以下信息: 1. n) New remote 2. s) Set configuration password 3. q) Quit config 4. n/s/q> n 5. name> Rats #随便填,后面要用到 6. Type of storage to configure. 7. Choose a number from below, or type in your own value 8. 1 / Amazon Drive 9. \ "amazon cloud drive" 10. 2 / Amazon S3 (also Dreamhost, Ceph, Minio) 11. \ "s3" 12. 3 / Backblaze B2 13. \ "b2" 14. 4 / Box 15. \ "box" 16. 5 / Cache a remote 17. \ "cache" 18. 6 / Dropbox 19. \ "dropbox" 20. 7 / Encrypt/Decrypt a remote 21. \ "crypt" 22. 8 / FTP Connection 23. \ "ftp" 24. 9 / Google Cloud Storage (this is not Google Drive) 25. \ "google cloud storage" 26. 10 / Google Drive 27. \ "drive" 28. 11 / Hubic 29. \ "hubic" 30. 12 / Local Disk 31. \ "local" 32. 13 / Microsoft Azure Blob Storage 33. \ "azureblob" 34. 14 / Microsoft OneDrive 35. \ "onedrive" 36. 15 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH) 37. \ "swift" 38. 16 / Pcloud 39. \ "pcloud" 40. 17 / QingCloud Object Storage 41. \ "qingstor" 42. 18 / SSH/SFTP Connection 43. \ "sftp" 44. 19 / Webdav 45. \ "webdav" 46. 20 / Yandex Disk 47. \ "yandex" 48. 21 / http Connection 49. \ "http" 50. Storage> 14 #选择14,Microsoft OneDrive 51. Microsoft App Client Id - leave blank normally. 52. client_id> #留空 53. Microsoft App Client Secret - leave blank normally. 54. client_secret> #留空 55. Remote config 56. Choose OneDrive account type? 57. * Say b for a OneDrive business account 58. * Say p for a personal OneDrive account 59. b) Business 60. p) Personal 61. b/p> p #这里选择个人版,你想挂载Business就选择b 62. Use auto config? 63. * Say Y if not sure 64. * Say N if you are working on a remote or headless machine 65. y) Yes 66. n) No 67. y/n> n #选择n 68. For this to work, you will need rclone available on a machine that has a web browser available. 69. Execute the following on your machine: 70. rclone authorize "onedrive" 71. Then paste the result below: 72. result> {"access_token":""} #输入之前在客户端授权的内容 74. [Rats] 75. client_id = 76. client_secret = 77. token = {"access_token":""} 79. y) Yes this is OK 80. e) Edit this remote 81. d) Delete this remote 82. y/e/d> y # 选择y 83. Current remotes: 85. Name Type 86. ==== ==== 87. Rats onedrive 89. e) Edit existing remote 90. n) New remote 91. d) Delete remote 92. r) Rename remote 93. c) Copy remote 94. s) Set configuration password 95. q) Quit config 96. e/n/d/r/c/s/q> q #选择q退出 第四步:网盘挂载挂载为目录 1. 举例: 2. 目标:将rclone中的OneDrive挂载到本地/home/songtianlun/onedrive目录下,并清空本地目录内容(--allow-non-empty) 4. rclone mount OneDrive: /home/songtianlun/onedrive --allow-non-empty 6. 注:网盘目录和本地目录名称不可一致,否则报错 利用Screen让Rclone在后台运行screen -S onedrive之后再运行挂载命令。挂载完成后再用快捷键CTRL-a d 来暂时断开当前会话。最后用screen -r <screen_pid>重新连接上。若没有安装Screen,可以使用如下命令安装: 1. yum install screen #centos系统 2. apt-get install screen #debian/ubuntu系统 第五步:卸载磁盘 1. fusermount -qzu LocalFolder 常用命令 1. rclone config – 以控制会话的形式添加rclone的配置,配置保存在.rclone.conf文件中。 2. rclone copy – 将文件从源复制到目的地址,跳过已复制完成的。 3. rclone mount-挂载 4. rclone sync – 将源数据同步到目的地址,只更新目的地址的数据。 5. rclone move – 将源数据移动到目的地址。 6. rclone delete – 删除指定路径下的文件内容。 7. rclone purge – 清空指定路径下所有文件数据。 8. rclone mkdir – 创建一个新目录。 9. rclone rmdir – 删除空目录。 10. rclone check – 检查源和目的地址数据是否匹配。 11. rclone ls – 列出指定路径下所有的文件以及文件大小和路径。 12. rclone lsd – 列出指定路径下所有的目录/容器/桶。 13. rclone lsl – 列出指定路径下所有文件以及修改时间、文件大小和路径。 14. rclone md5sum – 为指定路径下的所有文件产生一个md5sum文件。 15. rclone sha1sum – 为指定路径下的所有文件产生一个sha1sum文件。 16. rclone size – 获取指定路径下,文件内容的总大小。 17. rclone version – 查看当前版本。 18. rclone cleanup – 清空remote。 19. rclone dedupe – 交互式查找重复文件,进行删除/重命名操作。
2022年06月21日
43 阅读
0 评论
0 点赞
2022-06-08
Linux命令
{tabs}{tabs-pane label="查询端口是否占用"}lsof -i:5706{/tabs-pane}{tabs-pane label="查看日志"}这会显示日志文件的末尾内容,默认显示最后10行。可以通过指定-n参数来显示指定行数的日志,例如:tail -n 20 logfile.txt这会显示最后20行日志。可以通过指定-f参数来跟踪文件变化,实时显示新增的日志,例如:tail -f logfile.txt这在需要实时监控日志变化时非常有用。{/tabs-pane}{/tabs}
2022年06月08日
61 阅读
0 评论
0 点赞
2022-06-07
Python错误类型
Python全部的错误类型错误类型——说明ZeroDivisionError——除(或取模)零 (所有数据类型)ValueError——传入无效的参数AssertionError——断言语句失败StopIteration——迭代器没有更多的值IndexError——序列中没有此索引(index)IndentationError——缩进错误OSError——输入/输出操作失败ImportError——导入模块/对象失败NameError——未声明/初始化对象 (没有属性)AttributeError——对象没有这个属性GeneratorExit——生成器(generator)发生异常来通知退出TypeError——对类型无效的操作KeyboardInterrupt——用户中断执行(通常是输入^C)OverflowError——数值运算超出最大限制FloatingPointError——浮点计算错误BaseException——所有异常的基类SystemExit——解释器请求退出Exception——常规错误的基类StandardError——所有的内建标准异常的基类ArithmeticError——所有数值计算错误的基类EOFError——没有内建输入,到达EOF 标记EnvironmentError——操作系统错误的基类WindowsError——系统调用失败LookupError——无效数据查询的基类KeyError——映射中没有这个键MemoryError——内存溢出错误(对于Python 解释器不是致命的)UnboundLocalError——访问未初始化的本地变量ReferenceError——弱引用(Weak reference)试图访问已经垃圾回收了的对象RuntimeError——一般的运行时错误NotImplementedError——尚未实现的方法SyntaxError Python——语法错误TabError——Tab 和空格混用SystemError——一般的解释器系统错误UnicodeError——Unicode 相关的错误UnicodeDecodeError——Unicode 解码时的错误UnicodeEncodeError——Unicode 编码时错误UnicodeTranslateError——Unicode 转换时错误以下为警告类型Warning——警告的基类DeprecationWarning——关于被弃用的特征的警告FutureWarning——关于构造将来语义会有改变的警告OverflowWarning——旧的关于自动提升为长整型(long)的警告PendingDeprecationWarning——关于特性将会被废弃的警告RuntimeWarning——可疑的运行时行为(runtime behavior)的警告SyntaxWarning——可疑的语法的警告UserWarning——用户代码生成的警告
2022年06月07日
113 阅读
0 评论
0 点赞
2022-05-26
此内容被密码保护
加密文章,请前往内页查看详情
2022年05月26日
9 阅读
0 评论
0 点赞
2022-05-26
APScheduler最基本的用法: “定时几秒后启动job”
APScheduler最基本的用法: “定时几秒后启动job”两种调度器: BackgroundScheduler和BlockingScheduler的区别,job执行时间大于定时调度时间特殊情况的问题及解决方法每个job都会以thread的方式被调度。1、基本的定时调度APScheduler是python的一个定时任务调度框架,能实现类似linux下crontab类型的任务,使用起来比较方便。它提供基于固定时间间隔、日期以及crontab配置类似的任务调度,并可以持久化任务,或将任务以daemon方式运行。下面是一个最基本的使用示例:from apscheduler.schedulers.blocking import BlockingScheduler def job(): print('job 3s') if __name__=='__main__': sched = BlockingScheduler(timezone='MST') sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start()它能实现每隔3s就调度job()运行一次,所以程序每隔3s就输出'job 3s'。通过修改add_job()的参数seconds,就可以改变任务调度的间隔时间。2、BlockingScheduler与BackgroundScheduler区别APScheduler中有很多种不同类型的调度器,BlockingScheduler与BackgroundScheduler是其中最常用的两种调度器。那他们之间有什么区别呢? 简单来说,区别主要在于BlockingScheduler会阻塞主线程的运行,而BackgroundScheduler不会阻塞。所以,我们在不同的情况下,选择不同的调度器:BlockingScheduler: 调用start函数后会阻塞当前线程。当调度器是你应用中唯一要运行的东西时(如上例)使用。BackgroundScheduler: 调用start后主线程不会阻塞。当你不运行任何其他框架时使用,并希望调度器在你应用的后台执行。下面用两个例子来更直观的说明两者的区别。BlockingScheduler例子from apscheduler.schedulers.blocking import BlockingScheduler import time def job(): print('job 3s') if __name__=='__main__': sched = BlockingScheduler(timezone='MST') sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): # 不会被执行到 print('main 1s') time.sleep(1) 运行这个程序,我们得到如下的输出:job 3s job 3s job 3s job 3s 可见,BlockingScheduler调用start函数后会阻塞当前线程, 导致主程序中while循环不会被执行到。 BackgroundScheduler例子from apscheduler.schedulers.background import BackgroundScheduler import time def job(): print('job 3s') if __name__=='__main__': sched = BackgroundScheduler(timezone='MST') sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): print('main 1s') time.sleep(1) 可见,BackgroundScheduler调用start函数后并不会阻塞当前线程,所以可以继续执行主程序中while循环的逻辑。main 1s main 1s main 1s job 3s main 1s main 1s main 1s job 3s 通过这个输出,我们也可以发现,调用start函数后,job()并不会立即开始执行。而是等待3s后,才会被调度执行。如何让job在start()后就开始运行如何才能让调度器调用start函数后,job()就立即开始执行呢?其实APScheduler并没有提供很好的方法来解决这个问题,但有一种最简单的方式,就是在调度器start之前,就运行一次job(),如下from apscheduler.schedulers.background import BackgroundScheduler import time def job(): print('job 3s') if __name__=='__main__': job() # 执行一次就好了哟 sched = BackgroundScheduler(timezone='MST') sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): print('main 1s') time.sleep(1) 这样就能得到如下的输出job 3s main 1s main 1s main 1s job 3s main 1s main 1s main 1s这样虽然没有绝对做到“让job在start()后就开始运行”,但也能做到“不等待调度,而是刚开始就运行job”。如果job执行时间过长会怎么样如果执行job()的时间需要5s,但调度器配置为每隔3s就调用一下job(),会发生什么情况呢?我们写了如下例子:from apscheduler.schedulers.background import BackgroundScheduler import time def job(): print('job 3s') time.sleep(5) if __name__=='__main__': sched = BackgroundScheduler(timezone='MST') sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): print('main 1s') time.sleep(1)运行这个程序,我们得到如下的输出:main 1s main 1s main 1s job 3s main 1s main 1s main 1s Execution of job "job (trigger: interval[0:00:03], next run at: 2018-05-07 02:44:29 MST)" skipped: maximum number of running instances reached (1) main 1s main 1s main 1s job 3s main 1s可见,3s时间到达后,并不会“重新启动一个job线程”,而是会跳过该次调度,等到下一个周期(再等待3s),又重新调度job()。为了能让多个job()同时运行,我们也可以配置调度器的参数max_instances,如下例,我们允许2个job()同时运行:from apscheduler.schedulers.background import BackgroundScheduler import time def job(): print('job 3s') time.sleep(5) if __name__=='__main__': job_defaults = { 'max_instances': 2 } sched = BackgroundScheduler(timezone='MST', job_defaults=job_defaults) sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): print('main 1s') time.sleep(1)运行程序,我们得到如下的输出:main 1s main 1s main 1s job 3s main 1s main 1s main 1s job 3s main 1s main 1s main 1s job 3s每个job是怎么被调度的通过上面的例子,我们发现,调度器是定时调度job()函数,来实现调度的。那job()函数会被以进程的方式调度运行,还是以线程来运行呢?为了弄清这个问题,我们写了如下程序:from apscheduler.schedulers.background import BackgroundScheduler import time,os,threading def job(): print('job thread_id-{0}, process_id-{1}'.format(threading.get_ident(), os.getpid())) time.sleep(50) if __name__=='__main__': job_defaults = { 'max_instances': 20 } sched = BackgroundScheduler(timezone='MST', job_defaults=job_defaults) sched.add_job(job, 'interval', id='3_second_job', seconds=3) sched.start() while(True): print('main 1s') time.sleep(1)运行程序,我们得到如下的输出:main 1s main 1s main 1s job thread_id-10644, process_id-8872 main 1s main 1s main 1s job thread_id-3024, process_id-8872 main 1s main 1s main 1s job thread_id-6728, process_id-8872 main 1s main 1s main 1s job thread_id-11716, process_id-8872可见,每个job()的进程ID都相同,但线程ID不同。所以,job()最终是以线程的方式被调度执行。来源:https://www.jb51.net/article/218332.htm
2022年05月26日
97 阅读
0 评论
0 点赞
2022-05-24
filter的基础用法
filter的基础用法对于列表(或其他序列类型),如果希望从中筛选出满足某个约束条件的子列表,我们一般的做法是使用一个for循环遍历每个元素然后执行相同约束条件判断,将满足条件的放入新的子列表中。例如,从列表中找出所有偶数子列表,并按对应的先后顺序放入子列表中:a = [1, 2, 3, 4, 5] b = [] for i in a: if i % 2 == 0: b.append(i)那么如果使用filter的话,使用filter函数使得代码变得更简洁:a = [1, 2, 3, 4, 5] def check(i): return i % 2 == 0 b = list(filter(check, a))示例content = "### #123 #234#568 #566#569#565#568" listdata = [i.strip() for i in content.split("#")] c = list(set(filter(lambda o: o, listdata))) print(listdata) print(c) # 输出 ['', '', '', '', '123', '234', '568', '566', '569', '565', '568'] ['566', '569', '565', '234', '123', '568']
2022年05月24日
115 阅读
0 评论
0 点赞
2022-05-24
对列表内的字典进行排序
降序排序alldate = [{'学号': 2.0, '姓名': '李四', '科目': '数学', '成绩': 77.0}, {'学号': 3.0, '姓名': '王五', '科目': '数学', '成绩': 78.0}, {'学号': 1.0, '姓名': '张三', '科目': '数学', '成绩': 90.0}, {'学号': 3.0, '姓名': '王五', '科目': '英语', '成绩': 76.0}, {'学号': 1.0, '姓名': '张三', '科目': '英语', '成绩': 90.0}, {'学号': 2.0, '姓名': '李四', '科目': '英语', '成绩': 91.0}, {'学号': 1.0, '姓名': '张三', '科目': '语文', '成绩': 88.0}, {'学号': 3.0, '姓名': '王五', '科目': '语文', '成绩': 88.0}, {'学号': 2.0, '姓名': '李四', '科目': '语文', '成绩': 89.0}] # 升序排序将reverse去掉即可 alldate.sort(key=lambda x: (x['成绩']), reverse=True) # alldate.reverse() print(alldate)多条件排序alldate.sort(key=lambda x: (x['成绩'], x['科目'])) # 按照科目和成绩进行双排序
2022年05月24日
27 阅读
0 评论
0 点赞
1
...
5
6
7