当前位置: 首页 > news >正文

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

麒麟 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.jsqmd.com/news/27922/

相关文章:

  • 如何选择陶瓷放电管
  • 10.31每日总结
  • 对称密钥算法 非对称密钥算法 Hash函数 公钥和私钥在网络安全中的应用流程超超超详细,清楚,简单!!!
  • 读《代码大全2》读后感3
  • revit api楼梯创建
  • 《代码大全2》初读有感
  • 代码大全2{2}
  • revit api 几何图元连接
  • 读《代码大全2》读后感2
  • 公众号排版工具实测报告:为什么有一云AI编辑器成为全能高效的“排版专家”?
  • 代码大全2{1}
  • Shooting Battle:Linux系统下的网络编程究极产物
  • revit api隔离图元
  • revit api明细表
  • 【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享 - 教程
  • 2025.10.31
  • 使用RNNoise进行音频降噪
  • 程序员修炼之道:从小工到专家读后感(2025_10_31)
  • Python测试(下) _ 高效率把bug揪出来
  • 如何精准驱动菜品识别模型--基于米尔瑞芯微RK3576边缘计算盒
  • 征程 6 | 多任务 不同帧率 部署方案
  • 10月31号
  • 10月29号
  • ️ 深度解析我的 Overleaf 私有化部署:一份稳定、高兼容性的 `docker-compose.yaml`
  • 支配点对小记
  • 2025赣南脐橙最新推荐品牌榜,源头赣南脐橙果园品牌综合评测!
  • Manacher 代码贴贴
  • Python测试(上)_ 不存在不写bug的程序员
  • P9119 [春季测试 2023] 圣诞树
  • Java性能调优的艺术:从字节码到云端的全链路优化