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

使用Pythonnet在C#中导入Python脚本报错:模块无foo属性

解决Python.Runtime导入包后找不到函数的问题

出现'module 'example' has no attribute 'foo''错误的核心原因是:你导入的example是一个Python包,但foo函数没有被暴露在这个包的顶层命名空间中,空的__init__.py不会自动将子模块的内容导入到包的命名空间里。

以下是几种可行的解决方式:

方式一:修改包的__init__.py导出函数

在site-packages/example/__init__.py中添加代码,将包含foo函数的子模块内容导入到包的顶层:

# 假设你的foo函数写在example文件夹下的main.py里,替换成实际的文件名
from .main import foo

这样修改后,原有的C#代码无需改动,导入example包后就能直接调用foo方法。

方式二:在C#中直接导入子模块

如果不想修改__init__.py,可以在C#代码里直接导入包含foo函数的具体子模块:

Runtime.PythonDLL = "python311.dll";
PythonEngine.Initialize();

using (Py.GIL())
{
    // 替换成实际的子模块名,比如example.main
    var script = Py.Import("example.your_script_name");
    var result = script.InvokeMethod("foo");
}

方式三:将函数直接放在__init__.py中

把你的foo函数直接写入site-packages/example/__init__.py文件内:

def foo():
   return 1

这种方式下,原C#代码也可以正常运行。

额外验证步骤

如果尝试以上方法后仍有问题,可以先确认Python环境的模块路径是否正确,在C#中添加如下代码打印sys.path:

using (Py.GIL())
{
    var sys = Py.Import("sys");
    Console.WriteLine(sys.GetAttr("path"));
}

确保site-packages目录在输出的路径列表中,否则需要手动添加路径:

using (Py.GIL())
{
    var sys = Py.Import("sys");
    sys.GetAttr("path").InvokeMethod("append", new PyString(@"你的site-packages路径"));
}

内容的提问来源于stack exchange,提问作者DP.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:22:52