麒麟 V10系统中离线安装python的setuptools和pip,并使用python代码查询达梦数据库,并上传文件到minio

news/2025/10/31 21:37:44/文章来源:https://www.cnblogs.com/databank/p/19181315

麒麟 V10系统中默认安装了python3.7版本,但是没有安装pip命令

1.python 环境安装

	1.下载Python版本对用的 setuptools和pip版本 源码包下载地址:setuptools:https://pypi.org/project/setuptools/#files(选择.tar.gz或.whl)pip:https://pypi.org/project/pip/#files(选择.tar.gz或.whl)建议下载最新版本的.tar.gz源码包(兼容性更好)2.将下载的setuptools-xxx.tar.gz和pip-xxx.tar.gz通过 U 盘、共享文件夹等方式拷贝到麒麟 V10 系统中(如/root/offline_packages目录)3.安装 setuptools(pip 依赖)# 进入安装包目录cd /root/offline_packages# 解压setuptoolstar -zxvf setuptools-xxx.tar.gzcd setuptools-xxx# 用系统自带的python3安装python3 setup.py install4.安装 pip# 返回安装包目录cd ..# 解压piptar -zxvf pip-xxx.tar.gzcd pip-xxx# 安装pippython3 setup.py install5.验证安装pip3 --version  # 或 pip --version(若系统默认指向python3)

  2.dmPython和minio包的离线安装

	1.在有网络的机器上下载包# 创建存储目录mkdir offline_packages# 下载dmPython及其依赖pip download dmPython -d ./offline_packages# 下载minio及其依赖pip download minio -d ./offline_packages2.将包拷贝到目标机器通过 U 盘、移动硬盘或其他方式,将offline_packages目录拷贝到需要离线安装的机器上。3.在目标机器上进行离线安装# 安装dmPythonpip install --no-index --find-links=./offline_packages dmPython# 安装miniopip install --no-index --find-links=./offline_packages minio	

  3.python代码

# -*- coding: utf-8 -*-"""将达梦数据库中的文件上传到 MinIO 并按要求处理。依赖:pip install dmPython minio运行示例:python scripts/upload_dm_to_minio.py
"""from __future__ import annotationsimport logging
import os
import sys
from contextlib import closing
from datetime import datetime
from pathlib import Path
from typing import Iterator, Tupletry:import dmPython  # type: ignore
except ModuleNotFoundError as exc:  # pragma: no coverraise SystemExit("未找到 dmPython 库,请先使用 `pip install dmPython` 安装后再运行此脚本") from excfrom minio import Minio
from minio.error import S3Error# --------------------------- 配置区 --------------------------- #
DM_HOST = "127.0.0.1"
DM_PORT = 5237
DM_USER = "SYSDBA"
DM_PASSWORD = "SYSDBA001"
DM_SCHEMA = "TEST_SCHEMA"
DM_TABLE = "t_files"
DM_FIELD_ROWGUID = "ROW_GUID"
DM_FIELD_FILEPATH = "FILE_PATH"MINIO_ENDPOINT = "127.0.0.1:9000"
MINIO_ACCESS_KEY = "admin"
MINIO_SECRET_KEY = "admin"
MINIO_BUCKET = "test"
MINIO_SECURE = False  # MinIO 默认为 httpBASE_DIR = Path("/data")LOG_FILE = Path(__file__).with_name("upload_failures.log")# --------------------------- 日志配置 --------------------------- #
LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
file_handler = logging.FileHandler(LOG_FILE, encoding="utf-8")
file_handler.setLevel(logging.ERROR)console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(message)s",handlers=[file_handler, console_handler],
)logger = logging.getLogger(__name__)# --------------------------- 数据库相关 --------------------------- #
def iter_attachments() -> Iterator[Tuple[str, str]]:"""从达梦数据库读取 rowGuid 和 filePath。"""conn = dmPython.connect(user=DM_USER,password=DM_PASSWORD,server=DM_HOST,port=DM_PORT,)with closing(conn):with closing(conn.cursor()) as cursor:cursor.execute(f"SELECT {DM_FIELD_ROWGUID}, {DM_FIELD_FILEPATH} "f"FROM {DM_SCHEMA}.{DM_TABLE} "f"WHERE {DM_FIELD_ROWGUID} IS NOT NULL AND {DM_FIELD_FILEPATH} IS NOT NULL")while True:row = cursor.fetchone()if row is None:breakyield row[0], row[1]# --------------------------- MinIO 相关 --------------------------- #
def ensure_bucket_exists(client: Minio, bucket_name: str) -> None:if not client.bucket_exists(bucket_name):client.make_bucket(bucket_name)def build_object_name(row_guid: str, source_path: Path) -> str:suffix = source_path.suffixif not suffix:return row_guidreturn f"{row_guid}{suffix}"def upload_one_file(client: Minio, bucket: str, row_guid: str, file_path: Path) -> None:object_name = build_object_name(row_guid, file_path)client.fput_object(bucket, object_name, file_path.as_posix())logger.info("上传成功:%s -> %s/%s", file_path, bucket, object_name)def log_failure(file_path: Path, exc: Exception) -> None:size = file_path.stat().st_size if file_path.exists() else -1logger.error("上传失败 | 路径: %s | 时间: %s | 大小: %s | 错误: %s",file_path,datetime.now().isoformat(timespec="seconds"),size,exc,)# --------------------------- 主流程 --------------------------- #
def main() -> None:client = Minio(MINIO_ENDPOINT,access_key=MINIO_ACCESS_KEY,secret_key=MINIO_SECRET_KEY,secure=MINIO_SECURE,)ensure_bucket_exists(client, MINIO_BUCKET)processed = 0failed = 0for row_guid, file_path_value in iter_attachments():relative_path = file_path_value.lstrip("/\\")full_path = (BASE_DIR / relative_path).resolve()if not full_path.exists():log_failure(full_path, FileNotFoundError("文件不存在"))failed += 1continuetry:upload_one_file(client, MINIO_BUCKET, row_guid, full_path)except (FileNotFoundError, S3Error, OSError) as exc:log_failure(full_path, exc)failed += 1continuetry:full_path.unlink()logger.info("已删除本地文件:%s", full_path)except OSError as exc:logger.warning("文件删除失败:%s,错误:%s", full_path, exc)processed += 1logger.info("处理完成,总计:%s,失败:%s", processed + failed, failed)if __name__ == "__main__":try:main()except Exception as exc:  # pragma: no coverlogger.exception("脚本运行异常: %s", exc)sys.exit(1)

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择陶瓷放电管

陶瓷放电管GDT原理:气体放电。电管有一脉冲击穿电压,不工作状态是电路处于断路,电阻大,电容小。一旦脉冲过压达到放电管的脉冲击穿电压,极间的电场强度超过气体的击穿强度时,就引起间隙放电,管内气体电离,放电…

10.31每日总结

10.31每日总结学习了软考的知识,总结回顾了周一学的画图的东西

对称密钥算法 非对称密钥算法 Hash函数 公钥和私钥在网络安全中的应用流程超超超详细,清楚,简单!!!

不是哥们,理解了半天,感觉自己是天才😎😎😎 一、对称密钥算法(私钥加密) 对称密钥算法也称为私钥加密,这里的 “私钥” 指的是 “秘密的、需要保密的密钥” ,而不是非对称体系中的“私钥”。它强调的是这个…

读《代码大全2》读后感3

书中对 “变量命名与代码逻辑梳理” 的讲解。之前在写小程序的报名统计功能时,我把存储用户信息的变量命名为 “user1”“user2”,还把数据筛选、统计、导出的逻辑揉在一个函数里。后来社团换届,新成员接手代码时,…

revit api楼梯创建

revit api楼梯创建 using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Architecture; using Autodesk.Revit.UI; using System; using System.Collections.Generic;namespace Stai…

《代码大全2》初读有感

第一次翻开《代码大全2》的时候,我其实有点被它的厚度吓到了。这本厚得像砖头一样的书,真的能读完吗? 但慢慢读下去,我发现了很多有意思的地方。原来给变量取名有这么多讲究,以前我都是随便写个a、b、c的。作者说…

代码大全2{2}

最深的感悟是 “软件构建是系统性工程”。作者没有局限于代码本身,而是从软件质量目标、项目规划、团队协作等部分切入。其中关于 “技术债务” 的论述我觉得很有道理,每一次敷衍的设计都会为后续埋下隐患。优秀的程…

revit api 几何图元连接

revit api 几何图元连接namespace Autodesk.Revit.DB {public static class JoinGeometryUtils{public static bool AreElementsJoined(Document document, Element firstElement, Element secondElement);public sta…

读《代码大全2》读后感2

书中关于 “代码设计” 的内容,也帮我解决了大难题。在做图书管理系统时,我一股脑把所有功能都堆在一个类里,写了几百行代码后,想加个 “借阅记录查询” 功能,改一处就报错一处。直到看到书中说 “小型工具适合结…

公众号排版工具实测报告:为什么有一云AI编辑器成为全能高效的“排版专家”?

🧭 一、前言:AI排版正在重构创作效率 过去,公众号运营者最怕的不是写不出内容,而是排版。 错行、图片偏移、格式混乱…… 这些问题几乎每天都在消耗创作者的耐心。 但随着AI技术进入内容生态,“AI排版编辑器”迅…

代码大全2{1}

编程不只是写代码,前期的需求分析、架构设计和规划是高质量软件的基石。书强调 “磨刀不误砍柴工”,充分的前期准备能避免后期大量返工,那些关于项目复杂度评估、构建环境搭建的建议,既有理论高度又贴近实践,严谨…

Shooting Battle:Linux系统下的网络编程究极产物

服务器端 一、关键技术要点总结 1. 网络编程基础Socket API 使用:socket() → bind() → listen() → accept() 完整流程 TCP 字节流特性:无消息边界,需自定义协议(帧结束标记 <<<FRAME_END>>>)…

revit api隔离图元

revit api隔离图元namespace Autodesk.Revit.DB {public class View : Element{// 相关隔离的 APIpublic void ConvertTemporaryHideIsolateToPermanent();public void IsolateCategoriesTemporary(ICollection<Ele…

revit api明细表

revit api明细表如果想要读取明细表的内容,可以用 ViewSchedule 父类 TableView 的接口。 namespace Autodesk.Revit.DB {public class TableView : View{public int MaximumRowHeight { get; }public int MaximumCol…

【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.10.31

今天没课在宿舍躺一天

使用RNNoise进行音频降噪

使用RNNoise进行音频降噪操作系统:Debian 12.5_x64 & Windows10_x64 rnnoise版本:0.2 gcc版本:12.2.0 python版本: 3.9.13 RNNoise是一个将传统数字信号处理与深度学习相结合的开源实时音频降噪库,可在消耗极…

程序员修炼之道:从小工到专家读后感(2025_10_31)

在正确与容易之间:每个程序员都面临的永恒选择 《程序员修炼之道》的第七章像一面镜子,照出了每个程序员日常工作中最真实的挣扎。当“在正确与容易之间做选择”这个命题出现在面前时,我感到心头一震——这不正是我…

Python测试(下) _ 高效率把bug揪出来

Python测试(下) _ 高效率把bug揪出来#导入测试内置模块import unittest#导入要测试的api,Student为类名from _oop import Studentfrom _oop import SmallStudent#需要继承unittest.TestCase,def函数必须用test_开头…

如何精准驱动菜品识别模型--基于米尔瑞芯微RK3576边缘计算盒

在人工智能与边缘计算深度融合的今天,将AI模型高效部署于终端设备已成为产业智能化的关键。本文将分享基于米尔MYD-LR3576边缘计算盒子部署菜品识别安卓Demo的实战经验。该设备凭借其内置的强劲瑞芯微RK3576芯片,为视…