ARTICLE · 1175668
2python之pdf解析bug追踪及lsof命令使用
写在前面的话
告个段落。昨天,正在搞项目,一个舅转来7000块钱,没有说话,我发了句:感谢舅还钱,如果不是因为买房,我也不会催舅,上次要钱有不对的地方,请舅原谅。舅还是没说话,上个月还了3000,这个月7000,正好还完。又过了几分钟,舅说:你能借舅钱,舅表示感谢,给你带来的麻烦,体谅一下。我好久没给你妈通话了,让我给你妈说说话吧。我赶紧回复说:我还在公司,等晚上回去我给你视频。我又说了一些请求原谅的话,舅始终不再回复。我知道,因为要钱这件事,彻底把舅得罪了,但该面对的总要面对,晚上回去,我给老妈说了这个事,再次强调,因为在天津买房才要的,舅是实在亲戚,不到万不得一不会要的。老妈说:不打了,你不给我一点脸,钱也要回来了,我能说啥,再者来说,你舅家闺女生孩子,你不替我拿钱,我当姑的还怎么说,还怎么和你舅通话。这个事情先这样,告个段落,因为要钱的事,让老妈没面子,让舅为难,归根到底还是我无能导致的,如果我有钱,会不会好一点呢。
[79+200]--------底部有张生活照片
【关键词】python、ragflow、pdf解析、lsof命令
一、pdf解析bug追踪(三级)
描述:现在pdf解析,遇到一个问题,一直追踪不到,接着处理。
开工:
第一步:pid追踪(四级)
20250818周一时间段:18:35-19:00提问如下:
怎么通过以下进进程信息,看python执行的是哪个程序,python进程信息如下: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1839 admin 20 0 1858120 269080 69312 S 4.3 0.4 43:02.05 python3.11
方案如下:
要从给定的进程信息中确定 Python 正在执行的程序,可以按照以下步骤操作:
1. 查看进程的完整命令行
使用 ps 命令查看该进程的完整命令行参数:
ps -f -p 1839或者:
ps aux | grep 1839这会显示类似如下的输出:
text
UID PID PPID C STIME TTY STAT TIME CMDadmin 1839 1 4 Aug15 ? Sl 43:02 python3.11 /path/to/your_script.py
如果 Python 正在运行脚本,
CMD列会显示python3.11 your_script.py或类似内容。如果 Python 是交互式运行(如 REPL 或 Jupyter),可能只显示
python3.11。
2. 检查进程的工作目录和可执行文件
进入 /proc 目录查看进程信息:
bash
ls -l /proc/1839/exe # 查看 Python 解释器的路径ls -l /proc/1839/cwd # 查看进程的工作目录cat /proc/1839/cmdline # 查看完整的命令行参数(以 \0 分隔)
cmdline文件会显示 Python 启动时的完整命令,如:text
python3.11\0/path/to/your_script.py\0--arg1\0value1\0
3. 检查环境变量(如有必要)
如果需要查看进程的环境变量:
bash
cat /proc/1839/environ | tr '\0' '\n'某些 Python 程序(如 Flask、Django)可能会通过环境变量(如 FLASK_APP)指定入口文件。
4. 使用 lsof 查看打开的文件
bash
lsof -p 1839这会列出该进程打开的所有文件,包括:
当前执行的
.py文件。导入的模块(在
site-packages或本地目录中)。数据文件或套接字。
5. 常见情况分析
直接运行脚本:
COMMAND列会显示python3.11 your_script.py。模块方式运行(如
python -m module):会显示python3.11 -m module_name。交互式 Shell/REPL:仅显示
python3.11。Web 服务(如 Gunicorn、uWSGI):可能显示
python3.11 app:app或类似格式。
示例输出解读
根据你提供的进程信息:
text
1839 admin ... python3.11如果 COMMAND 列仅显示 python3.11,可能是:
交互式 Python Shell。
通过
exec或fork动态加载的进程(如某些守护进程)。通过
python -c "code"直接执行的代码片段。
进一步确认
如果上述方法仍无法确定,可以尝试:
bash
sudo grep -a "Traceback" /proc/1839/fd/* 2>/dev/null # 检查是否有错误日志sudo strace -p 1839 -s 1024 # 动态跟踪系统调用(谨慎使用)
第二步:总结(四级)
最直接的方法是:
bash
cat /proc/1839/cmdline | tr '\0' ' '这会显示完整的 Python 启动命令,包括脚本路径或模块名。
二、扫码聊天问题(三级)
描述:现在扫码聊天进行不了,需要处理一下。
开工:
第一步:扫码聊天(四级)
20250819周二时间段:11:19-12:00这个出问题,是由于欠费导致的,已反馈龙哥,先这样,截图如下:

图2b-1
注:充完值后就好了。接下来,看下缩略图不显示的问题。
第二步:缩略图不显示(四级)
20250819周二时间段:14:35-16:00不显示截图如下:

图2b-2
注:这个主要是链接地址需要加api,加完api,可以正常访问,如下:

2b-3
注:获取链接的程序如下:
https://api.ai.epet.com/v1/document/list?kb_id=bf5b0a6eff1211ef94e1acde48001122&keywords=&page_size=10&page=1程序如下:
@manager.route('/list', methods=['GET']) # noqa: F821@login_requireddef list_docs(): kb_id = request.args.get("kb_id") if not kb_id: return get_json_result( data=False, message='Lack of "KB ID"', code=RetCode.ARGUMENT_ERROR) tenants = UserTenantService.query(user_id=current_user.id) for tenant in tenants: if KnowledgebaseService.query( tenant_id=tenant.tenant_id, id=kb_id): break else: return get_json_result( data=False, message='Only owner of knowledgebase authorized for this operation.', code=RetCode.OPERATING_ERROR) keywords = request.args.get("keywords", "") page_number = int(request.args.get("page", 1)) items_per_page = int(request.args.get("page_size", 15)) orderby = request.args.get("orderby", "create_time") desc = request.args.get("desc", True) try: docs, tol = DocumentService.get_by_kb_id( kb_id, page_number, items_per_page, orderby, desc, keywords) for doc_item in docs: if doc_item['thumbnail'] and not doc_item['thumbnail'].startswith(IMG_BASE64_PREFIX): doc_item['thumbnail'] = f"/v1/document/image/{kb_id}-{doc_item['thumbnail']}" return get_json_result(data={"total": tol, "docs": docs}) except Exception as e: return server_error_response(e)
注:对上述代码进行修改,如下:
host_url_arr = get_host_url_arr(request) log.info(f"host_url: {host_url_arr}") for doc_item in docs: log.info(f"Updated thumbnail URL1: {doc_item['thumbnail']}") if doc_item['thumbnail'] and not doc_item['thumbnail'].startswith(IMG_BASE64_PREFIX): doc_item['thumbnail'] = f"/v1/document/image/{kb_id}-{doc_item['thumbnail']}" if 'pet.bitzero.cn' in host_url_arr['netloc'] or 'ai.epet.com' in host_url_arr['netloc']: doc_item['thumbnail'] = f"{host_url_arr['scheme']}://api.{host_url_arr['netloc']}{doc_item['thumbnail']}" log.info(f"Updated thumbnail URL2: {doc_item['thumbnail']}")
注:这个主要是加api,接下来,进行上线测试 。
第三步:测试缩略图(四级)
20250819周二时间段:15:22-16:00测试了一下,效果还可以,截图如下:

图2b-4
注:这个有一点需要注意的是获取的url前面就带api.,所以不需要额外加的,修改代码如下:
docs, tol = DocumentService.get_by_kb_id( kb_id, page_number, items_per_page, orderby, desc, keywords) host_url = get_host_url(request) log.info(f"host_url: {host_url}") for doc_item in docs: # log.info(f"Updated thumbnail URL1: {doc_item['thumbnail']}") if doc_item['thumbnail'] and not doc_item['thumbnail'].startswith(IMG_BASE64_PREFIX): doc_item['thumbnail'] = f"{host_url}/v1/document/image/{kb_id}-{doc_item['thumbnail']}" if 'pet.bitzero.cn' in host_url or 'ai.epet.com' in host_url: doc_item['thumbnail'] = f"{host_url}{doc_item['thumbnail']}" # log.info(f"Updated thumbnail URL2: {doc_item['thumbnail']}") return get_json_result(data={"total": tol, "docs": docs})
注:这样一来就完美并且优雅了。
三、生活照片
拍摄于2025年11月4日,9:05:08,老妈在家里做饭时拍的。今天回来,走在路上,我在想,为啥穷人借不到钱呢?向亲戚借不到,向陌生人更借不到。因为人家有,也可能不借,怕后期要钱麻烦,亲戚之间,后期要钱,要考虑很多,承受很大的心理压力。最终的结果很可能是钱要回来了,亲戚也断了,或者是钱压根要不回来,是自己亲戚,不可能去告他。就拿我舅来说,他如果坚持不还钱,我也没办法,我如果起诉,我妈这一关我就过不去。人和人的觉悟是不一样的,就拿舅妈来说,我生两个孩子她都没表示,她女儿生个孩子第一时间通知我,我没拿钱,让我妈很难堪;我如果拿了这个钱,我媳妇指定给我墨迹。通知我这个事,纯纯给我添麻烦啊。

图2c-1
《本文完》















































































