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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:04:09