Win32环境下Pythonnet 2.5.2传递Python回调至C# DLL时遇System未解析引用及No module named 'System'问题求助
解决Win32环境下Pythonnet导入System模块失败的问题
我来帮你排查这个Win32环境下Pythonnet导入System模块的问题,咱们一步步来分析和解决:
问题原因
你遇到的未解析引用System和No module named 'System'错误,通常是由以下几个原因导致的:
- Python与Pythonnet位数不匹配:Win32环境要求使用32位Python,但如果安装了64位的Pythonnet,就会出现加载失败的情况
- 未显式加载.NET程序集:Pythonnet默认不会自动加载所有核心.NET程序集,需要手动引用System程序集才能访问其下的类型
- Pythonnet安装损坏/版本兼容问题:安装过程中缓存或包损坏,不过Pythonnet 2.5.2本身是支持Python 3.7.6的
- 缺少.NET Framework依赖:Pythonnet 2.x依赖.NET Framework(而非.NET Core),若系统未安装合适版本的.NET Framework,也会导致加载失败
解决步骤
1. 确认Python与Pythonnet的位数匹配
首先检查你的Python是32位还是64位:
import struct print(struct.calcsize('P') * 8) # 输出32表示32位Python,64表示64位
因为你是Win32环境,必须使用32位Python 3.7.6,同时安装对应32位的Pythonnet 2.5.2。如果之前安装的是64位Pythonnet,先卸载重装:
pip uninstall -y pythonnet pip install pythonnet==2.5.2 --force-reinstall --no-cache-dir
2. 修正导入逻辑,显式引用System程序集
Pythonnet需要先加载对应的.NET程序集才能访问其类型,修改你的导入代码:
import clr # 显式添加对System核心程序集的引用 clr.AddReference("System") # 现在再导入Action就不会报错了 from System import Action # 其余模块的导入 import wx import wx.lib.filebrowsebutton as filebrowse import os import serial import threading import time import configparser
这一步是关键,因为System属于.NET核心程序集,必须显式调用clr.AddReference让Pythonnet加载它。
3. 检查.NET Framework版本
Pythonnet 2.5.2依赖.NET Framework 4.5及以上版本,你可以通过以下方式检查:
- 打开控制面板 → 程序和功能 → 查看已安装的更新,找到
.NET Framework相关条目
如果版本过低,安装微软官方提供的.NET Framework 4.8版本(Win32环境支持的最新稳定版)
4. 测试最小运行示例
先写一个极简代码排除其他模块的干扰,验证Pythonnet是否正常工作:
import clr clr.AddReference("System") from System import Action def test_callback(): print("Python回调被C#调用了!") # 创建Action实例并调用 action = Action(test_callback) action.Invoke()
如果这个代码能正常输出,说明Pythonnet已经配置正确,问题可能出在后续的其他模块交互中;如果还是报错,回到步骤1重新检查位数和安装。
内容的提问来源于stack exchange,提问作者schanti schul
相关产品推荐
相关产品推荐

