rd /s/q C:\Users\%USERNAME%\.anaconda
rd /s/q C:\Users\%USERNAME%\AppData\Roaming\.anaconda
rd /s/q C:\Users\%USERNAME%\.conda
rd /s/q C:\Users\%USERNAME%\AppData\Local\conda
del /s/q C:\Users\%USERNAME%\.condarc
作者: kukey-admin
-
win清理conda残余
-
win清理python残余
rd /s/q %USERPROFILE%\AppData\Local\Python
rd /s/q %USERPROFILE%\AppData\Local\pip
reg delete “HKCU\Software\Python” /f
rd /s/q %USERPROFILE%\AppData\Roaming\Python
rd /s/q %USERPROFILE%\AppData\Roaming\piprd /s/q “C:\Users\%USERNAME%\.ipython”
rd /s/q “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.8”
rd /s/q “C:\Users\Public\Documents\Python Scripts”
rd /s/q “C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.8”
rd /s/q “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.8”
rd /s/q “C:\Users\rkey\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.5”
rd /s/q “C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Python 3.12”
-
flask创建一个database.py,里面只用来创建db,models文件夹下的post.py导入db,app里创建数据库表
也算是一个避免循环导入的例子吧.
来源:文心一言,但是我稍有修改.
在 Flask 项目中,你可以通过以下步骤来组织代码,以便在 database.py 文件中创建数据库连接,并在 models/post.py 文件中定义模型,然后在 Flask 应用中创建数据库表。
项目结构
假设你的项目结构如下:my_flask_app/ │ ├── app.py ├── database.py ├── models/ │ └── post.py └── ...
1. 创建 database.py
在 database.py 文件中,我们将创建一个 SQLAlchemy 数据库实例。
# database.pyfrom flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
2. 创建 models/post.py
在 models/post.py 文件中,我们将导入 database.py 中的 db 实例,并定义一个 Post 模型。
# models/post.pyfrom database import db from datetime import datetime class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) def __repr__(self): return f"Post('{self.title}', '{self.date_posted}')"
3. 在 app.py 中配置 Flask 应用和数据库
在 app.py 文件中,我们将配置 Flask 应用,创建数据库连接,并应用迁移来创建数据库表。
# app.pyfrom flask import Flask from flask_sqlalchemy import SQLAlchemy from database import db from models.post import Post app = Flask(__name__) # 配置数据库 URI app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' # 你可以使用其他数据库,比如 MySQL, PostgreSQL 等 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 初始化数据库实例 db.init_app(app) @app.route('/') def home(): posts = Post.query.all() return f"Home Page<br>{[post.title for post in posts]}" if __name__ == '__main__': # 创建所有表 with app.app_context(): db.create_all() # 运行 Flask 应用 app.run(debug=True)
cmd命令提示符里运行以下命令:
python app.py
现在,你的 Flask 应用应该能够启动,并且会在 site.db 中创建 post 表。访问 http://127.0.0.1:5000/ 将显示主页,尽管目前还没有任何帖子。
这样,你就成功地创建了一个 Flask 项目,其中包含数据库连接、模型定义和数据库表创建逻辑。
-
root.wm_iconbitmap()和root.iconbitmap()两个函数有啥区别
在Tkinter中,
root.wm_iconbitmap()
和root.iconbitmap()
都是用来设置窗口图标的方法,但它们之间存在一些差异:root.iconbitmap()
:- 这个方法是Tkinter提供的一个接口,用于设置窗口的图标。
- 它只能加载
.ico
格式的图标文件,不支持其他格式如.png
或.jpg
。 - 使用方法简单,只需要提供图标文件的路径即可:
root.iconbitmap("/path/to/your/icon.ico")
root.wm_iconbitmap()
:- 这个方法实际上是
root.wm()
方法的一个子命令,wm
是Tkinter窗口方法(Window Manager)的缩写,用于与窗口管理器进行交互。 - 它同样用于设置窗口图标,但调用方式与
iconbitmap()
不同,它需要通过wm
方法来调用iconbitmap
命令。 - 使用
wm_iconbitmap()
时,你需要传递窗口实例和图标文件路径:root.wm_iconbitmap("/path/to/your/icon.ico")
- 这个方法在功能上与
iconbitmap()
相似,但调用方式更为底层,因为它直接通过Tkinter的wm
子系统与窗口管理器通信。
- 这个方法实际上是
总结来说,
root.iconbitmap()
和root.wm_iconbitmap()
都可以设置窗口图标,但iconbitmap()
是Tkinter提供的更高层的接口,而wm_iconbitmap()
则通过wm
子系统提供了一种更为底层的调用方式。在实际使用中,两者的效果相同,但iconbitmap()
因其简单易用而更常被使用。 -
pip install -U这个参数-U是啥意思
pip install -U
命令中的-U
参数是用于更新指定的包到最新版本。这里的-U
是--upgrade
的缩写。当你使用这个参数时,pip
会检查指定包的最新版本,并将其更新到最新版本,如果该包已经是最新版,则不会有任何变化。例如,如果你想要更新
requests
包,你可以使用以下命令:pip install -U requests
这会将
requests
包更新到最新版本。如果你没有指定包名,pip install -U
会尝试更新所有已安装的包。 -
python库Nuitka-2.4.11依赖
nuitka-2.4.11
ordered-set-4.1.0
zstandard-0.21.0
Collecting nuitka
Downloading Nuitka-2.4.11.tar.gz (3.7 MB)
—————————————- 3.7/3.7 MB 1.4 MB/s eta 0:00:00
Installing build dependencies … done
Getting requirements to build wheel … done
Preparing metadata (pyproject.toml) … done
Collecting ordered-set>=4.1.0 (from nuitka)
Downloading ordered_set-4.1.0-py3-none-any.whl.metadata (5.3 kB)
Collecting zstandard>=0.15 (from nuitka)
Downloading zstandard-0.21.0-cp37-cp37m-win_amd64.whl.metadata (3.0 kB)
Downloading ordered_set-4.1.0-py3-none-any.whl (7.6 kB)
Downloading zstandard-0.21.0-cp37-cp37m-win_amd64.whl (659 kB)
—————————————- 659.7/659.7 kB 6.0 MB/s eta 0:00:00
Building wheels for collected packages: nuitka
Building wheel for nuitka (pyproject.toml) … done
Created wheel for nuitka: filename=Nuitka-2.4.11-cp37-cp37m-win_amd64.whl size=3402958 sha256=aa8e430bd06ad97a6d2eb25fc9e19b7915d2d5b14a0e401245907b8895952af7
Stored in directory: c:\users\rkey\appdata\local\pip\cache\wheels\8c\89\72\e408cd495b3903ecbad851052183da7c128679edba64c98f50
Successfully built nuitka
Installing collected packages: zstandard, ordered-set, nuitka
Successfully installed nuitka-2.4.11 ordered-set-4.1.0 zstandard-0.21.0 -
C语言】自己写的C语言的时间函数
写于 2020-10-06 20:37:19,当时发布在csdn上。–#include<stdio.h> #include<time.h> int gTime(){ //获取系统时间 int year,month,day,hour,minutes,second; time_t t = time(NULL); year = t/86400/365+1970; month = t/86400/30%12+4; day = t/86400%30+5;//一天等于86400秒,即3600*24 hour = t%(3600*24)/3600+8;//加8正好是中国的时区时间的小时,不知道为啥。 minutes = t%3600/60; second = t%60; printf("t:%d",t); printf("year:%d",year); printf("month:%d",month); printf("day:%d",day); printf("hour:%d",hour); printf("minutes:%d",minutes); printf("second:%d",second); printf("%d年%d月%d日 %d:%d:%d",year,month,day,hour,minutes,second); return year,month,day,hour,minutes,second; }
–以上是C语言获取时间的函数,自己写的。想要调用的时候,自己在main函数里调用一下。 -
flask-bt之tracker录入
templates\trackers_index.html
–
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>trackers</title> </head> <body> {% if session.logged_in %} <form action="/logout" method="get"> <input type="submit" value="登出"> </form> {% else %} <form action="/login" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" id="password" placeholder="密码"> <input type="submit" value="登录"> </form> {% endif %} <main> <!-- flask的flash函数专用固定代码 专门用来显示内容的 --> {% for message in get_flashed_messages() %} <div class="alert">{{ message }}</div> {% endfor %} </main> <p>tracker总数量:{{count}}</p> <form action="/trackers_search" method="post"> <input type="text" name="trackers_name" placeholder="请输入tracker关键字"> <input type="submit" value="搜索"> </form> {% if session.logged_in %} <!-- 登录表单,实际上用户已经登录,所以可以显示欢迎信息或其他内容 --> <form action="/trackers_add" method="post"> <label for="trackers_name">trackers_add:</label> <input type="text" name="trackers_name" placeholder="请输入完整的tracker链接"> <input type="submit" value="提交"> </form> <form action="/trackers_delete" method="post"> <label for="trackers_name">trackers_delete:</label> <input type="text" name="trackers_name" placeholder="请输入完整的tracker链接"> <input type="submit" value="删除"> </form> {% endif %} <hr> <div class="tracker_box scrollable-div"> <form action="/get_trackers_as_text" method="get"> <input type="submit" value="去复制,请使用Ctrl+A和Ctrl+C复制"> </form> {% for i in trackers %} <ul style="list-style-type: none"> <li>{{i.name}}</li> </ul> {% endfor %} </div> </body> </html> <style> * { margin:0; padding:0; } .scrollable-div { height: 800px; /* 或者你需要的高度 */ overflow-y: auto; /* 内容超出时在 y 轴方向显示滚动条 */ overflow-x: auto; /* 内容超出时在 x 轴方向显示滚动条 */ } </style>
–
app.py
–
from flask import Flask, request, render_template, redirect, url_for, flash, session from flask_sqlalchemy import SQLAlchemy import os from datetime import datetime from flask_cors import CORS import secrets ''' 待实现: flash错误提示显示红色,警告信息显示黄色,成功显示绿色,使用div画出来 ''' app = Flask(__name__) # 为整个应用启用 CORS CORS(app) # 启用 CORS 并设置特定的域名 #CORS(app, resources={r"/some_route": {"origins": "http://example.com"}}) # 或者,允许所有域名访问所有路由 CORS(app, resources={r"*": {"origins": "*"}}) # 获取当前文件的路径 basedir = os.path.abspath(os.path.dirname(__file__)) # 设置数据库文件的路径为当前目录下的 data.db app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db') #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////data.db' app.secret_key = secrets.token_urlsafe() # 用于保持会话安全,字符串随机即可 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False#模型修改的跟踪 db = SQLAlchemy(app) class Trackers(db.Model): __tablename__= 'trackers' id = db.Column(db.Integer, unique=True, comment='id') name = db.Column(db.String(64), primary_key=True, comment='Trackers,主键') is_usable = db.Column(db.String(64), unique=False, comment='Tracker是否可用') create_date = db.Column(db.DateTime, unique=False, default=datetime.now(), comment='Tracker创建日期') update_date = db.Column(db.DateTime, unique=False, comment='Tracker更新日期') def __repr__(self): return '<Trackers %r>' % self.name def create_tables(): with app.app_context(): db.create_all() @app.route('/') @app.route('/trackers_index') def trackers_index(): trackers = Trackers.query.order_by(Trackers.create_date.desc()).all()#倒序输出所有 count = Trackers.query.count()#tracker总数量 return render_template('trackers_index.html', trackers=trackers, count=count) @app.route('/get_trackers_as_text') def get_trackers_as_text(): trackers = Trackers.query.all() lines = [f"{tracker.name}" for tracker in trackers] text = "<br>".join(lines) return text @app.route('/trackers_add', methods=['POST'], endpoint='add_announcement') def announcement_add(): trackers_name = request.form['trackers_name'] # 关键词列表 keywords = ['announce', 'http', 'udp', 'https', 'wss'] # 检查字符串是否包含列表中的任意关键词 if contains_keywords(trackers_name, keywords) or trackers_name.endswith('announce'): print("提交信息中包含关键字") else: flash("你提交的可能不是tracker链接") return redirect(url_for('trackers_index')) exists = Trackers.query.filter_by(name=trackers_name).first() is not None if exists: flash('tracker 已经存在.') else: flash('tracker 不存在,已插入.') new_tracker = Trackers(name=trackers_name) db.session.add(new_tracker) db.session.commit() return redirect(url_for('trackers_index')) def contains_keywords(s, keywords): return any(keyword in s for keyword in keywords) @app.route('/trackers_delete/<int:trackers_name>', methods=['POST'], endpoint='delete_announcement_specific') def delete_announcement_specific(trackers_name): data = Trackers.query.filter_by(name=trackers_name).first() if data: db.session.delete(data) db.session.commit() flash(f'【{data}】已删除') return redirect(url_for('trackers_index')) else: return 'Tracker not found' @app.route('/trackers_delete', methods=['POST'], endpoint='delete_announcement') def delete_announcement(): trackers_name = request.form.get('trackers_name') or request.view_args.get('trackers_name') if not trackers_name: return '什么都没输入,你删除啥呢!!!' data = Trackers.query.filter_by(name=trackers_name).first() if data: db.session.delete(data) db.session.commit() flash(f'{data}已删除') return redirect(url_for('trackers_index')) else: return f'数据库中不存在该数据!!!{trackers_name}' @app.route('/trackers_update/<int:trackers_name>', methods=['POST'], endpoint='update_announcement') def announcement_update(trackers_name): data = Trackers.query.filter_by(name=trackers_name).first() if data: data.name = request.form.get('name') data.is_usable = request.form.get('description') db.session.commit() flash('Data has been updated successfully.', 'success') else: flash('Data not found.', 'error') return redirect(url_for('trackers_index')) @app.route('/trackers_search', methods=['GET', 'POST']) def announcement_search(): if request.method == 'POST': trackers_name = request.form.get('trackers_name') trackers = Trackers.query.filter(Trackers.name.like(f'%{trackers_name}%')).all() return render_template('trackers_index.html', trackers=trackers) return render_template('trackers_index.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username == 'admin' and password == 'admin': session['logged_in'] = True session['username'] = username flash("登陆成功") return redirect(url_for('trackers_index')) else: return '无效的用户名或密码' return redirect(url_for('trackers_index')) @app.route('/logout', methods=['GET', 'POST']) def logout(): session.pop('logged_in', None) session.pop('username', None) return redirect(url_for('trackers_index')) if __name__ == '__main__': # 创建数据库 create_tables() app.run(debug=True, host='0.0.0.0', port=5000)
–
-
certbot自动续签脚本学习
暂时没写完,以后有时间再写。也算是学习了一下linux的shell脚本了。使用的Centos7系统的bash版本信息如下:
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. 许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html> 这是自由软件,您可以自由地更改和重新发布。 在法律允许的范围内没有担保.
现在已经写了日期判断。
往后要写的内容是:关闭网站的nginx,然后执行续签的命令,但是现在想不到如何进行续签自动化,因为现在使用的txt解析记录的方式续签的,解析记录需要到域名服务商网站登录这一步很难搞定。
#!/bin/bash # 证书文件路径 CERT_PATH="/etc/letsencrypt/live/kuyour.top/fullchain.pem" # 获取证书到期日期 NOT_AFTER=$(openssl x509 -in "$CERT_PATH" -text -noout | grep "Not After" | sed 's/^[ \t]*//;s/[ \t]*$//') echo "证书到期时间:"$NOT_AFTER due_date=$(date -d "${NOT_AFTER:12:20}" +%s) #echo $due_date # 获取当前时间的时间戳 current_timestamp=$(date +%s) #echo $current_timestamp # 计算时间差 time_difference=$(($due_date-$current_timestamp)) days_remaining=$(($time_difference/60/60/24)) echo "当前距离证书到期的剩余天数:"$days_remaining echo $(($days_remaining == 1)) echo $((1==1)) # 检查剩余天数是否等于1 if [ $days_remaining -eq 1 ]; then echo "剩余天数等于1,执行某些指令" # 在这里放置你想要执行的指令 else echo "剩余天数不等于1,不执行指令" fi
-
bash脚本学习
date -d 命令可以把类似这样的日期时间转换成时间戳”Jan 28 16:47:16 2025″,它会计算自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。
命令如下:
date -d "Jan 28 16:47:16 2025" +%s
请严格按照这种格式进行填写,双引号后面有一个空格不能省略。
如果想要把这个日期变成可替换的,可以把整个命令使用小括号括起来,前面加上$符号,例如:
NOT_AFTER="Jan 28 16:47:16 2025" timestamp=$(date -d "$NOT_AFTER" +%s) echo $timestamp
以上代码有几点需要注意:
- bash脚本不兴有多余的空格,变量声明(变量的创建)时,等号两边不允许有空格。
- 获取变量要在变量名的前面加$符号。
- 如果整个命令执行的值要赋值给另一个变量(不管是新的变量还是旧的变量),可以把整个命令使用小括号括起来,然后前面加一个$符号就行。
字符串转数字,使用$(( ))把内容括起来,里面的内容会被自动识别为数值计算或逻辑运算,注意是双括号,且都是小括号。例如:
NOT_AFTER="Jan 28 16:47:16 2025" timestamp=$(date -d "$NOT_AFTER" +%s) days_remaining=$(($timestamp/60/60/24)) echo $days_remaining
逻辑表达式
bash脚本的逻辑表达式中,字符串比较通常使用
==
和!=
,数值比较通常使用-eq
(等于)和-ne
(不等于),这是因为 Bash 从 Unix shell 继承了这些比较运算符,而 Unix shell 中并没有为整数比较提供==
和!=
运算符。以下是 Bash 中字符串和整数比较的区别:
-
字符串比较:
if [ "$string1" == "$string2" ]; then echo "字符串相等" fi if [ "$string1" != "$string2" ]; then echo "字符串不相等" fi
-
整数比较:
if [ "$int1" -eq "$int2" ]; then echo "整数相等" fi if [ "$int1" -ne "$int2" ]; then echo "整数不相等" fi
如果你尝试使用
==
来比较整数,Bash 会将其视为字符串比较,这可能会导致意外的结果,特别是当整数变量包含前导零或不同的位数时。例如:int1=08 int2=8 if [ "$int1" == "$int2" ]; then echo "相等" # 这会输出“相等”,因为 Bash 将它们视为字符串比较,而 "08" 和 "8" 作为字符串是不相等的。 fi if [ "$int1" -eq "$int2" ]; then echo "相等" # 这不会输出任何内容,因为作为整数,08 和 8 是不相等的。 fi
因此,为了正确地比较整数,你应该使用
-eq
和-ne
运算符。逻辑表达式中整数比较不加引号也行
在 Bash 脚本中,是否在条件测试
[ ... ]
中对变量使用引号取决于具体情况。对于整数比较,通常可以不加引号,因为整数变量不包含空格或其他特殊字符,这些字符可能会导致条件测试被错误解析。然而,使用引号是一种更保守的做法,可以防止一些潜在的问题,特别是在变量值未知或可能为空的情况下。以下是两种情况的比较:
使用引号:
if [ "$int1" -eq "$int2" ]; then echo "整数相等" fi
不使用引号:
if [ $int1 -eq $int2 ]; then echo "整数相等" fi
在第二种情况中,如果你的变量
$int1
或$int2
为空,或者包含空格、特殊字符等,那么条件测试可能会出错。例如:int1="" int2=5 if [ $int1 -eq $int2 ]; then echo "整数相等" # 这将导致条件测试语法错误,因为 -eq 两边不能有空的参数。 fi
为了避免这类问题,推荐在条件测试中总是使用引号,除非变量的内容是已知的,并且不包含任何可能导致解析错误的字符。使用引号是一种好的编程习惯,可以提高脚本的健壮性和可移植性。
if语句基础
基本
if
语句命令判断如果特定条件为true
,则仅执行给定的一组操作。如果条件为false
,则不要执行这些操作。if
语句基本语法格式如下:if [ expression ]; then statements fi
仅当表达式(在方括号之间)为真时,才会执行
then
和fi
之间的语句。注意:观察第一行中使用的空格,在第一行末尾使用分号。两者都必须使用,
if
条件语句以fi
结尾。- 使用
AND
运算符使用多个条件:if [ expression_1 ] && [ expression_2 ]; then statements fi
- 使用
OR
运算符使用多个条件:if [ expression_1 ] || [ expression_2 ]; then statements fi
- 对于具有
AND&OR
运算符的复合表达式,可以使用以下语法:if [ expression_1 && expression_2 || expression_3 ]; then statements fi
//更多请阅读:https://www.yiibai.com/bash/bash-if-statement.html
示例1
在此示例中,读取用户输入任意数字,并检查该值是否大于
100
。脚本文件:if-example1.sh
#!/bin/bash read -p " Enter number : " number if [ $number -gt 100 ] then echo "Value is greater than 100" fi
执行上面示例代码,得到以下结果:
示例2
在此示例中,通过比较两个字符串的值,简单演示了
if
语句的用法。
脚本文件:if-example2.sh#!/bin/bash # if condition is true if [ "yiibai" == "yiibai" ]; then echo "true condition" fi # if condition is false if [ "yiibai.com" == "xntutor.com" ]; then echo "false condition" fi
执行上面示例代码,得到以下结果:
示例3
在此示例中,演示如何使用
if
语句比较数字。
脚本文件:if-example3.sh#!/bin/bash #if condition (greater than) is true if [ 10 -gt 3 ]; then echo "10 is greater than 3." fi #if condition (greater than) is false if [ 3 -gt 10 ]; then echo "3 is not greater than 10." fi #if condition (lesser than) is true if [ 3 -lt 10 ]; then echo "3 is less than 10." fi #if condition (lesser than) is false if [ 10 -lt 3 ]; then echo "10 is not less than 3." fi #if condition (equal to) is true if [ 10 -eq 10 ]; then echo "10 is equal to 10." fi #if condition (equal to) is false if [ 10 -eq 9 ]; then echo "10 is not equal to 9" fi
执行上面示例代码,得到以下结果:
示例4
在此示例中,将演示如何在
if
表达式中使用AND
运算符包括多个条件。脚本文件:if-example4.sh
#!/bin/bash # TRUE && TRUE if [ 8 -gt 6 ] && [ 10 -eq 10 ]; then echo "Conditions are true" fi # TRUE && FALSE if [ "mylife" == "mylife" ] && [ 3 -gt 10 ]; then echo "Conditions are false" fi
执行上面示例代码,得到以下结果:
maxsu@ubuntu:~/bashcode$ vi if-example4.sh maxsu@ubuntu:~/bashcode$ chmod +x if-example4.sh maxsu@ubuntu:~/bashcode$ ./if-example4.sh Conditions are true maxsu@ubuntu:~/bashcode$