You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器部署含PIConnect代码时遇PIAF SDK未找到错误求助

问题:PIConnect容器化运行时提示PIAF SDK未找到

问题描述

用户提供的Dockerfile如下:

ARG PYTHON_VERSION=3.10.11
FROM python:${PYTHON_VERSION}-slim as base

RUN pip install piaf
RUN apt-get update && \
    apt-get install -y mono-complete

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "/nonexistent" \
    --shell "/sbin/nologin" \
    --no-create-home \
    --uid "${UID}" \
    appuser


RUN pip install PIConnect

RUN pip install pythonnet
RUN --mount=type=cache,target=/root/.cache/pip \
    --mount=type=bind,source=requirements.txt,target=requirements.txt \
    python -m pip install -r requirements.txt

ENV PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.10/site-packages/PIAF_SDK:$PWD

USER appuser

COPY . .

EXPOSE 8000

RUN mono --version

CMD ["python", "main.py", "--data_dir2", "/container/path2"]

容器运行时出现以下错误:

/usr/local/lib/python3.10/site-packages/clr_loader/mono.py:180: UserWarning: Hosting Mono versions before v6.12 is known to be problematic. If the process crashes shortly after you see this message, try updating Mono to at least v6.12.
  warnings.warn(
Traceback (most recent call last):
  File "/app/main.py", line 18, in <module>
    import PIconnect as PI
  File "/usr/local/lib/python3.10/site-packages/PIconnect/__init__.py", line 5, in <module>
    from PIconnect.AFSDK import AF, AF_SDK_VERSION
  File "/usr/local/lib/python3.10/site-packages/PIconnect/AFSDK.py", line 54, in <module>
    raise ImportError("PIAF SDK not found, check installation")
ImportError: PIAF SDK not found, check installation

问题原因

  • Mono版本过低:警告明确指出低于v6.12的Mono版本存在兼容性问题,会影响PIAF SDK的加载逻辑。
  • PIAF SDK未正确部署:pip install piaf仅安装了Python封装层,而PIConnect依赖的核心是OSIsoft官方的AF SDK(.NET DLL库),该库无法通过pip直接获取,必须手动部署到容器中。
  • PYTHONPATH配置无效:设置的路径/usr/local/lib/python3.10/site-packages/PIAF_SDK下没有实际的AF SDK文件,配置形同虚设。

解决方案

1. 升级Mono版本

替换Dockerfile中安装mono的命令,添加Mono官方源安装指定高版本:

RUN apt-get update && apt-get install -y apt-transport-https dirmngr gnupg ca-certificates
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
RUN echo "deb https://download.mono-project.com/repo/debian stable-bullseye main" | tee /etc/apt/sources.list.d/mono-official-stable.list
RUN apt-get update && apt-get install -y mono-complete=6.12.0.182-0xamarin1+debian11b1

2. 手动部署AF SDK文件

从OSIsoft官方渠道获取AF SDK安装包,提取其中的核心DLL文件(如OSIsoft.AFSDK.dll等),将这些文件复制到容器中并配置Mono加载路径:

# 假设本地AF SDK DLL存放在./af-sdk目录
ENV MONO_PATH=/usr/local/lib/af-sdk:$MONO_PATH
COPY ./af-sdk/ /usr/local/lib/af-sdk/

3. 调整运行时环境变量

添加pythonnet所需的.NET运行时配置:

ENV CLR_RUNTIME=mono
ENV CLR_VERSION=v4.0.30319

修正后的Dockerfile示例

ARG PYTHON_VERSION=3.10.11
FROM python:${PYTHON_VERSION}-slim as base

# 安装高版本Mono
RUN apt-get update && apt-get install -y apt-transport-https dirmngr gnupg ca-certificates
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
RUN echo "deb https://download.mono-project.com/repo/debian stable-bullseye main" | tee /etc/apt/sources.list.d/mono-official-stable.list
RUN apt-get update && apt-get install -y mono-complete=6.12.0.182-0xamarin1+debian11b1

# 环境变量配置
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV CLR_RUNTIME=mono
ENV CLR_VERSION=v4.0.30319
ENV MONO_PATH=/usr/local/lib/af-sdk:$MONO_PATH

WORKDIR /app

# 创建非特权用户
ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "/nonexistent" \
    --shell "/sbin/nologin" \
    --no-create-home \
    --uid "${UID}" \
    appuser

# 安装Python依赖
RUN pip install PIConnect pythonnet
RUN --mount=type=cache,target=/root/.cache/pip \
    --mount=type=bind,source=requirements.txt,target=requirements.txt \
    python -m pip install -r requirements.txt

# 复制AF SDK DLL到容器
COPY ./af-sdk/ /usr/local/lib/af-sdk/

USER appuser

COPY . .

EXPOSE 8000

RUN mono --version

CMD ["python", "main.py", "--data_dir2", "/container/path2"]

是否可以将PIConnect SDK集成到容器中?

可以,但需要注意:

  • 必须合法获取OSIsoft AF SDK,遵守其许可协议。
  • 容器内需正确配置Mono和.NET运行时,确保AF SDK的DLL能被pythonnet正常加载。
  • 严格匹配版本兼容性:Mono版本不低于v6.12,Python版本需与PIConnect、pythonnet版本适配。

内容的提问来源于stack exchange,提问作者Raj Rajeshwari Prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:05:24