Python导入clr引用OSIsoft.AFSDK程序集报错问题求助
Python导入clr模块及OSIsoft.AFSDK程序集报错修复方案
第一个报错:AttributeError: module 'clr' has no attribute 'AddReference'
- 根因:PyPI源上名为
clr的独立包和pythonnet提供的clr运行时命名空间完全冲突,这个独立clr包不具备.NET程序集加载能力,属于完全无关的废弃工具。 - 修复操作:先彻底清除环境内的冲突包,再安装正确的pythonnet包,执行以下命令:
pip uninstall -y clr pip uninstall -y pythonnet pip install pythonnet
注意:安装的pythonnet必须和本地Python版本、系统架构完全匹配:64位Python必须对应64位编译的pythonnet,32位Python对应32位版本,架构不匹配会直接导致后续程序集加载失败。
第二个报错:FileNotFoundException: Unable to find assembly 'OSIsoft.AFSDK'
仅把SDK路径加到sys.path的操作无法解决问题:pythonnet加载.NET程序集时,不会默认从sys.path搜索原生DLL依赖,且如果程序集未加入全局缓存、依赖项缺失,单纯追加路径不会生效,按以下顺序排查修复:
- 校验SDK架构和路径正确性
你当前写的路径是32位程序目录Program Files (x86)下的SDK,如果你本地装的是64位Python,必须对应使用64位AF SDK,路径为C:\Program Files\PIPC\AF\PublicAssemblies\4.0,先到对应目录下确认OSIsoft.AFSDK.dll文件真实存在,路径写错是最高发的触发原因。 - 调整导入逻辑,显式指定程序集加载路径
不要仅用sys.path.append添加路径,需要同时把SDK目录加入系统PATH环境变量保证依赖DLL可被搜索,加载时优先用全路径方法加载DLL,替换原有导入代码为以下内容:
import sys import os # 按实际SDK安装路径修改,64位SDK去掉路径里的 (x86) AF_SDK_ROOT = r'C:\Program Files (x86)\PIPC\AF\PublicAssemblies\4.0' # 把SDK目录加入系统PATH,解决依赖DLL搜索问题 os.environ['PATH'] = AF_SDK_ROOT + os.pathsep + os.environ['PATH'] sys.path.append(AF_SDK_ROOT) import clr # 用全路径直接加载目标DLL,跳过全局搜索逻辑 clr.AddReferenceToFileAndPath(os.path.join(AF_SDK_ROOT, 'OSIsoft.AFSDK.dll')) # 后续业务导入逻辑保持不变 from OSIsoft.AF.PI import * from OSIsoft.AF.Search import * from OSIsoft.AF.Asset import * from OSIsoft.AF.Data import * from OSIsoft.AF.Time import * import pandas as pd from datetime import datetime
- 校验SDK安装完整性
本地安装的Oracle客户端和该报错无关联。AFSDK不能仅靠拷贝DLL运行,必须完整安装PI AF Client,其运行依赖配套的VC++运行库、PI连接组件等配套文件:如果手动拷贝DLL到目录,会因为缺少关联依赖触发加载失败。可以直接到SDK目录下双击OSIsoft.AFSDK.dll验证系统是否能正常识别该程序集,若系统无法识别,重新运行PI AF Client安装包选择修复即可。 - 校验.NET运行时版本
路径下的4.0版本AFSDK依赖.NET Framework 4.0及以上运行时,确认系统已启用.NET Framework 4.8功能;如果使用的是基于.NET Core编译的新版AFSDK,需要安装支持.NET Core运行时的pythonnet分支版本,否则会因运行时不兼容触发程序集找不到的报错。
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

