
我现在遇到的问题,我在 invoke 里有个 check_alive 的函数,里面是检查 我虚拟机的某个网址网页能不能访问,如果不能,那么调用 vagrant reload 重启虚拟机.
现在遇到了问题, 调用 vagrant reload 有时候会卡在那里. 所以我想想要不要添加一个超时,然后我试了几种
使用 subprocess.popen,然后 communicate 那里加 timeout 参数,没用
使用 func_timeout 库,也没有用.
今天又出现了,我尝试使用 invoke 的 run,再试试,你们有没有什么好的方法,这个调用外部命令怎么这么麻烦呢?
]]>⻝ (U+2EDD)和 食 (U+98DF)的关系是:它们是同一个字的不同视觉表现形式,但 Unicode 指定 U+98DF 为标准形式,U+2EDD 为其异体形式(特别是作为部首时)。
问了一下 AI ,都是让枚举做一个 map ,有没有统一的转化这样汉字的方案,unicodedata.normalize 不行。
]]>我们正面向中小企业和初创团队,做一款专注于用户反馈的管理分析工具 —— Feedalyze 。
它能多渠道统一收集、高效处理、可视化分析用户反馈,帮助中小企业洞察用户需求,加速产品迭代。地址: https://feedalyze.com/
Feedalyze 对标国外的 UserVoice + Dovetail ,希望成为国内企业首选的用户反馈管理分析平台。
1 、产品开发迭代常靠猜测或经验,而非用户真实需求。(如果参与过中小企业产品研发,就能理解这点)
2 、在收集、处理和分析用户反馈,调查用户需求时,企业成本高昂
3 、难以及时洞察用户需求,影响产品迭代速度和决策正确率
4 、缺乏可量化的数据支撑,产品方向容易偏离市场需求等
如果你对这个机会感兴趣,欢迎加微信一起聊聊,吃个饭。添加时请备注:姓名 + FastAPI
我的微信:M-ing2020
]]>django admin 有点重
fastapi-admin: 折腾得很麻烦,
fastadmin: 这个是最简单的,但是功能有点简陋,很多前端的功能没有实现。
]]>`TypeAdapter[typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]]` is not fully defined; you should define `typing.Annotated[app.models.teams.TeamPublicWithUser, FieldInfo(annotation=TeamPublicWithUser, required=True)]` and all referenced types, then call `.rebuild()` on the instance. 求各位大佬帮忙看看, 哪里有问题. python 版本用的是 3.12, 具体代码如下
models/users.py
from typing import TYPE_CHECKING, Any, Optional from sqlmodel import Field, Relationship, SQLModel if TYPE_CHECKING: from .teams import Team, TeamPublic class UserBase(SQLModel): username: str = Field(index=True, max_length=255, unique=True) email: str | NOne= Field(default=None, index=True, max_length=255) is_active: bool = True is_superuser: bool = False full_name: str | NOne= Field(default=None, max_length=255) team_id: int | NOne= Field(default=None, foreign_key="team.id") class User(UserBase, table=True): id: int | NOne= Field(default=None, primary_key=True) hashed_password: str team: Optional["Team"] = Relationship(back_populates="members") class UserPublic(UserBase): id: int class UserPublicWithTeam(UserPublic): team: Optional["TeamPublic"] = None models/teams.py
from typing import TYPE_CHECKING, Any, List from sqlmodel import Field, Relationship, SQLModel if TYPE_CHECKING: from .users import User, UserPublic class TeamBase(SQLModel): name: str = Field(max_length=255) class Team(TeamBase, table=True): id: int | NOne= Field(default=None, primary_key=True) members: List["User"] = Relationship(back_populates="team") class TeamPublic(TeamBase): id: int class TeamPublicWithUser(TeamPublic): members: List["UserPublic"] = [] router/users.py
# 用户相关接口 from sqlmodel import and_, select from app.api.deps import SessionDep from app.models.users import ( User, UserPublicWithTeam, ) from app.new_router import new_router router = new_router(prefix="/users", tags=["用户管理"]) @router.get("/{id}", summary="获取用户详情", response_model=UserPublicWithTeam) async def get_user_api(db: SessionDep, id: int): user = db.exec(select(User).where(and_(User.id == id, User.is_active))).first() return user router/teams.py
# 团队相关接口 from sqlmodel import select from app.api.deps import SessionDep from app.models.teams import ( Team, TeamPublicWithUser, ) from app.new_router import new_router router = new_router(prefix="/teams", tags=["团队管理"]) @router.get("/{id}", summary="获取团队详情", response_model=TeamPublicWithUser) async def get_team_api(db: SessionDep, id: int): team = db.exec(select(Team).where(Team.id == id)).first() return team ]]>目前 MCP 生态里,很多能力是 Node.js 实现的,Python 这边要么只是封装一层,要么偏同步阻塞。对那种“我就想写个 async 小工具”的场景,其实不太友好:
所以在自己的 MCP 工具里,基于官方协议搞了一个「精简版」实现,主要特点:
async,方便直接接到现有的 async Web 框架 / 任务系统 可以自行 TODO / 二次开发的方向包括:
DATA_DIR 做目录沙箱,防止越界访问,避免一上来就摸整个磁盘 Github 项目地址:
技术含量不多,纯粹有相同需求的人可以不用再思考太多,直接用,也可以当作组件拼接到其他地方。
]]>
自定义类 MoneyAgent 中有继承自父类 CellAgent 的对象 cell ,cell 具有属性 neighborhood ,pyright 完全意识不到。 请教: 1 、是不是有设置方法可以改进、提升 2 、除了 pyright 或者 nvim-cmp ,是不是还有更好的补全工具? 谢谢,请各位 V 友不吝赐教。 ]]>所以,直接写了一个 pip fast check pypi
pip install -U pip-fc
pip-fc或者python -m pip-fc
我的 Dockerfile 解决方案如下
pip install --no-cache-dir -U "pdm==2.25.9" "hishel<1.0.0"
]]>Github: https://github.com/rev1si0n/ja3
]]>在 arm64 上使用 pip 安装编译 PyQt 库,100%失败,pip 也没有 arm64 设备预编译好的 wheel. conda 在 arm64 设备提供预编译好的 pyqt 库,conda install 是可以直接基于当前 Python 版本安装的,不需要编译.
]]>这两天构思了一个爬虫框架,对外提供 API 创建爬虫任务,然后内部的队列会进行爬虫的消费。只需要实现数据的解析接口就能快速编写爬虫。非常适合需要利用 AI 快速生成爬虫代码的团队。 
这个框架对外提供了 API 接口来创建,非常便利。目前的设计思路就是只需要实现一个 parse 接口,就行了,方便后续 AI 的介入。
目前这是一个非常简单清晰的项目,希望和感兴趣的朋友共建这个项目,提升大家的技术影响力,或许对找远程工作也是有帮助的。
]]>最近在梳理 iterator ,不得不说, 即使自己写了很多年的代码,我仍然没有在实际应用中看到自定义的迭代器。即使读了很多书,但是这些书中的示例大多是滥竽充数,不具备实际应用意义。所以顺着网线爬上 V 站请教各位。
如果一个对象定义了
__iter__()方法或定义了__getitem__()方法,那么这样的对象称为可迭代对象(iterable)。
如果一个对象定义了
__iter__()方法和__next__()方法,那么这样的对象称为迭代器(iterator)。
注:
1.后续的讨论都是基于以上两个定义。
2.因迭代器常和可迭代对象结合使用,故引如可迭代对象这一概念,但迭代器的概念先于生成器(generator),在后续的讨论中请勿涉及生成器。
python 3 的 range() 是一个可迭代对象,其实现使用了迭代器。使用迭代器后不是直接生成列表,节省了内存,体现了迭代器的应用意义。
《 Learn Python Programming(4th)》 第 246 页:
class OddEven: def __init__(self, data): self._data = data self.indexes = list(range(0, len(data), 2)) + list(range(1, len(data), 2)) def __iter__(self): return self def __next__(self): if self.indexes: return self._data[self.indexes.pop(0)] raise StopIteration # Testing the OddEven class oddeven = OddEven("0123456789") print("".join(c for c in oddeven)) # 0246813579 oddeven = OddEven("ABCD") # or manually... it = iter(oddeven) # this calls oddeven.__iter__ internally print(next(it)) # A print(next(it)) # C print(next(it)) # B print(next(it)) # D 该示例虽然创建了一个迭代器,但就功能而言其实就是“将奇数位置的字符放在前半段,将偶数位置的字符放在后半段”,完全没有必要使用迭代器。关于迭代器的实力,本人看到的大多是这样的——毫无实际应用意义,令人深恶痛绝!
PEP 234 中写到 iterator 的 virtues 有:
- It provides an extensible iterator interface.
- It allows performance enhancements to list iteration.
- It allows big performance enhancements to dictionary iteration.
- It allows one to provide an interface for just iteration without pretending to provide random access to elements.
- It is backward-compatible with all existing user-defined classes and extension objects that emulate sequences and mappings, even mappings that only implement a subset of {
__getitem__,keys,values,items}.- It makes code iterating over non-sequence collections more concise and readable.
中译版:
如果包含该提案的所有部分,则会以一致且灵活的方式解决许多问题。其主要优点包括以下四点——不,五点——不,六点
- 它提供了一个可扩展的迭代器接口。
- 它允许对列表迭代进行性能优化。
- 它允许对字典迭代进行大幅度性能提升。
- 它允许为仅迭代提供接口,而无需假装提供对元素的随机访问。
- 它与所有现有的用户定义类和模拟序列和映射的扩展对象向后兼容,即使是仅实现了 {
__getitem__,keys,values,items} 子集的映射。- 它使遍历非序列集合的代码更加简洁易读。
上面所列出的优点较抽象,各位能否提供一些具体的例子?
各位在实际应用中是否自己实现过迭代器?如果有麻烦提供一些例子。
[1] Python Document Glossary ,iterator: https://docs.python.org/3/glossary.html#term-iterator
[2] PEP 234 – Iterators: https://peps.python.org/pep-0234
[3] PEP 234 – 迭代器: https://peps.pythonlang.cn/pep-0234/
]]>已经有人改了代码,为这个版本添加专门的名称:𝜋thon
]]>multiprocessing 依赖的又一步,还添加了 InterpreterPoolExecutor 来帮助管理多个解释器的并行;import ___ 的自动补全;python -m asyncio <ps|pstree> <PID> 功能来检查正在运行的异步 Python 程序的 async task 树。更多可在这里看到: https://docs.python.org/zh-cn/3.14/whatsnew/3.14.html
]]>对于遵循 er 模型来构建视图数据的项目,fastapi-router-viz 可以为了解 api 返回类型间的关系提供快速,直接,可交互的图效果。
可以通过点击节点高亮全部上下游链路, 了解 pydantic class 的上下游依赖情况
alt 点击查看节点的源代码,或者直接在 vscode 中打开
根据 class + field name 来精准定位数据被哪些页面/ 接口使用
]]>我的网络是可以用 gemini cli 之类的,按理说应该不是网络问题啊。
简单测试代码如下:
import yfinance as yf import pandas as pd # 设置永辉超市的股票代码 ticker = "601933.SS" # .SS 表示上海证券交易所 # 创建 yfinance 对象 stock = yf.Ticker(ticker) # 获取实时价格(最新收盘价或当前价格,视市场情况而定) current_price = stock.history(period="1d")["Close"].iloc[-1] # 获取股票的详细信息(包括公司名称等) info = stock.info # 输出结果 print(f"永辉超市 ({ticker}) 的实时价格: {current_price:.2f} CNY") print(f"公司名称: {info.get('shortName', '未知')}") 运行就直接报错:
line 11, in <module> current_price = stock.history(period="1d")["Close"].iloc[-1] ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/base.py", line 91, in history return self._lazy_load_price_history().history(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/scrapers/history.py", line 178, in history data = get_fn( ^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/data.py", line 364, in get return self._make_request(url, request_method = self._session.get, user_agent_headers=user_agent_headers, params= params, timeout=timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/utils.py", line 103, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/lib/python3.12/site-packages/yfinance/data.py", line 424, in _make_request raise YFRateLimitError() yfinance.exceptions.YFRateLimitError: Too Many Requests. Rate limited. Try after a while. 这要怎么解决呢,难道 yahoo 的 API 封这么严重啊。有没有知道怎么解决的老兄啊,感谢!
]]>例子:
class Demo: @app.task @classmethod def test(cls): pass schedule 注册任务: Demo.test ]]>gettext 不支持动态选择语言 (比如 Bot 需要根据用户选择语言)f-string 语法, 写起来不够优雅, 不够方便所以, Easy AI18n 诞生了, 解决了以上所有痛点
Easy AI18n 是一个现代化的 Python3 国际化工具库,支持 AI 翻译、多用户场景以及完整的字符串格式化语法,让项目全球化变得更加优雅自然。
https://github.com/z-mio/easy-ai18n
| 其他 i18n 工具 | EasyAI18n |
|---|---|
需手动维护翻译字典, 开发效率低 | 自动提取翻译内容,无需手动维护文件 |
仅支持部分格式化语法 | 完全支持所有格式化语法 |
不支持实时多语言切换,不适用于多用户场景 | 支持默认语言与多语言切换,适配多用户环境 |
通过自定义语言选择器, 在多用户环境中实现动态语言选择:
/i18n.py:
from pyrogram.types import Message from easy_ai18n import EasyAI18n, PostLanguageSelector class MyPostLanguageSelector(PostLanguageSelector): def __getitem__(self, msg: Message): lang = msg.from_user.language_code return super().__getitem__(lang) i18n = EasyAI18n() _ = i18n.i18n(post_lang_selector=MyPostLanguageSelector) if __name__ == "__main__": i18n.build(target_lang=['en', 'ru']) /bot.py:
@bot.on_message() async def start(__, msg: Message): await msg.reply(_[msg]("Hello, world!")) ]]>进程已结束,退出代码为 -1073741571 (0xC00000FD) 的退出码 ]]>
]]>>>> type({/}) <class 'set'> >>> {/} == set() True 感觉好奇怪的语法,,为啥非要引入一个空 set 语法??有啥特别大的好处吗?? set() 也挺短的啊??
]]>一直请求 403 ,难受,搞不定,用无头 playwrihgt ,又不过 cloudflare ,请求又被拒绝,难搞!
想请教一下 v2 的各位佬,怎么爬这个网站聊天对话。
]]>
让他改个算法代码,把我代码给删错了,导致整个工程出现不可控问题 ]]>1 、把需要加入的内容保存到 GACode.txt 文件中
2 、执行代码,输入目录即可。(只会修改 html 扩展名的文件)
import os import re import sys from pathlib import Path def get_resource_path(relative_path): """获取资源文件的绝对路径,支持 PyInstaller 打包""" try: # PyInstaller 创建临时文件夹,并将路径存储在_MEIPASS 中 base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) def check_and_add_google_analytics(): """ 检查所有 HTML 文件是否包含 Google Analytics 代码,如果不存在则添加 """ # 初始化统计信息 stats = { 'total': 0, 'modified': 0, 'skipped': 0, 'errors': 0 } # 从 GACode.txt 文件读取 Google Analytics 代码 ga_code_file = get_resource_path('GACode.txt') try: with open(ga_code_file, 'r', encoding='utf-8') as f: ga_code = f.read().strip() except FileNotFoundError: print(f"错误:找不到文件 {ga_code_file}") stats['errors'] = 1 return stats except Exception as e: print(f"错误:读取 GA 代码文件时出错: {str(e)}") stats['errors'] = 1 return stats if not ga_code: print("错误:GA 代码文件为空") stats['errors'] = 1 return stats # 获取当前目录下所有 HTML 文件 html_files = list(Path('.').glob('*.html')) stats['total'] = len(html_files) print(f"找到 {len(html_files)} 个 HTML 文件") for html_file in html_files: print(f"\n 处理文件: {html_file}") try: # 读取文件内容 with open(html_file, 'r', encoding='utf-8') as f: cOntent= f.read() # 检查是否已经包含 Google Analytics 代码 if 'googletagmanager.com/gtag/js' in content: print(f" ✓ {html_file} 已包含 Google Analytics 代码,跳过") stats['skipped'] += 1 continue # 查找</head>标签的位置 head_end_pattern = r'</head>' match = re.search(head_end_pattern, content, re.IGNORECASE) if not match: print(f" ✗ {html_file} 未找到</head>标签,跳过") stats['errors'] += 1 continue # 在</head>标签前插入 Google Analytics 代码 head_end_pos = match.start() new_cOntent= ( content[:head_end_pos] + ' ' + ga_code + '\n' + content[head_end_pos:] ) # 写入修改后的内容 with open(html_file, 'w', encoding='utf-8') as f: f.write(new_content) print(f" ✓ {html_file} 已成功添加 Google Analytics 代码") stats['modified'] += 1 except Exception as e: print(f" ✗ 处理 {html_file} 时出错: {str(e)}") stats['errors'] += 1 print("\n 处理完成!") return stats if __name__ == "__main__": try: # 获取用户输入的目录路径 current_dir = input("请输入要处理的目录路径: ").strip() # 如果用户没有输入,则使用当前目录 if not current_dir: current_dir = os.getcwd() print(f"当前工作目录: {current_dir}") # 切换到指定目录 try: os.chdir(current_dir) except FileNotFoundError: print(f"错误:目录 '{current_dir}' 不存在") input("\n 按回车键退出...") exit(1) except PermissionError: print(f"错误:没有权限访问目录 '{current_dir}'") input("\n 按回车键退出...") exit(1) # 检查是否在包含 HTML 文件的目录中 html_files = list(Path('.').glob('*.html')) if not html_files: print("当前目录下没有找到 HTML 文件,请确保在正确的目录下运行此脚本") input("\n 按回车键退出...") exit(1) # 执行添加 Google Analytics 代码的操作 stats = check_and_add_google_analytics() # 检查返回值是否有效 if stats is None: print("\n⚠ 函数执行异常,无法获取统计信息") stats = {'total': 0, 'modified': 0, 'skipped': 0, 'errors': 1} # 显示统计结果 print("\n=== 执行统计 ===") print(f"总文件数: {stats['total']}") print(f"成功修改: {stats['modified']} 个") print(f"已存在跳过: {stats['skipped']} 个") print(f"处理失败: {stats['errors']} 个") if stats['modified'] > 0: print(f"\n✓ 成功为 {stats['modified']} 个 HTML 文件添加了 Google Analytics 代码!") elif stats['total'] > 0 and stats['skipped'] == stats['total']: print("\n✓ 所有 HTML 文件都已包含 Google Analytics 代码,无需修改。") else: print("\n⚠ 没有成功修改任何文件,请检查文件格式或权限。") print("\n=== 程序执行完成 ===") input("\n 按回车键退出...") except KeyboardInterrupt: print("\n\n 程序被用户中断") input("\n 按回车键退出...") except Exception as e: print(f"\n 程序执行时发生未知错误: {str(e)}") input("\n 按回车键退出...") 我就不发成品了,自行打包哈
]]>logger ,requests 都属于第三方模块。但是 logger 就是红线。最初以为是环境没识别,但是运行都是正常的,这事情很费解啊。有解决办法么?
咋个没图,贴个地址吧 https://imgur.com/C7tWIvh
]]>今天稍微搜了下,,发现文章中提到的 PEP 727 、PEP 740 并不是文章中描述的内容。。似乎整篇文章都是胡编乱造的。。
搞不懂谁会写这种东西??难道是 AI 生成的??

class X,需要改掉的东西注释写的是y=Union[X, str],实际情况也是两种类型到处都混在一起根本分不清。后面所有跟X类有关的方法一点注释没写,甚至都不做类型判断,而是大量的使用getattr(y, 'name', y)把水搅得更浑(如果y是字符串,没有name,返回字符串本身。否则返回y.name也是一个字符串)。最离谱的是整座屎山还配了一套 30 分钟才能跑完的 pytest 。 现在需要把混乱的y分成确定类型的y和y_str,使用 pydantic 强制定义数据类型来一点点排错。然而改了几百行以后,所有跟X有关的方法都被迫改出两种版本的。pytest 不再报类型错误了,却开始出现各种离奇的 bug 挂掉。
有什么更强大的工具可以搞定这件事吗?比如同步检测两个版本的代码,看从哪一步开始两边的数据变得不一致了?
]]>官方推荐解决方案: 如果在 Django 的请求-响应周期之外的长运行进程中创建了连接,该连接将保持打开状态,直到显式关闭或超时发生。你可以使用 django.db.close_old_connections() 来关闭所有旧的或不可用的连接。
我觉得太 low 了。理论上,只需要设置每次调用 ORM 开始前获取一条连接,调用结束后关闭连接即可解决这个问题。
有没有大佬遇到过这个问题?如何更加优雅的解决?
]]>问题不是必现的,偶尔就出现一次
问了 AI 给的也是模糊的的回答
连接 pg 数据库用的是 pool = PooledDB()
执行代码如下
def dbQuery(self, sql): cOnn= pool.connection() cur = conn.cursor() cur.execute(sql) result = cur.fetchall() cur.close() conn.close() return result 报错如下:
could not receive data from server: Software caused connection abort (0x00002745/10053) Traceback (most recent call last): File "aaTestV5.py", line 844, in process input_values = self.getInputValuesInfo() File "aa_process.py", line 117, in getInputValuesInfo order_list = super(tf, self).getInputValuesInfo() File "aaTestV5.py", line 555, in getInputValuesInfo results_fromno, no_list = self.getFromnoResult() File "aa_process.py", line 366, in getFromnoResult return self.getFromnoResultInner(False) File "aa_process.py", line 320, in getFromnoResultInner results_fromno, no_list = super(tf, self).getFromnoResult(True) File "aaTestV5.py", line 119, in getFromnoResult result_fromno1 = self.dbQuery(query_sql) File "aa_process.py", line 391, in dbQuery return super(tf, self).dbQuery(sql) File "aaTestV5.py", line 823, in dbQuery cur.execute(sql) File "\python\lib\site-packages\dbutils\steady_db.py", line 598, in tough_method result = method(*args, **kwargs) # try to execute psycopg2.DatabaseError: could not receive data from server: Software caused connection abort (0x00002745/10053) ]]>好像是刚发布的, 没看到有人讨论, 我也是昨天看到的
目前只支持 windows , 但官方产品应该以后会支持 linux, mac 把
官方总算认识到 python 的版本管理是个问题了
]]>