使用Python.NET无法导入同目录下的自定义Python模块求助
解决.NET嵌入Python时无法导入同目录模块的问题
核心问题是Python的模块搜索路径sys.path默认未包含你的脚本所在目录——即使你确认了当前工作目录,嵌入场景下sys.path的初始配置也可能和独立运行Python时不同。以下是具体解决步骤:
1. 手动将脚本目录添加到sys.path
在C#代码中导入目标模块前,把脚本所在目录加入Python的sys.path:
using Python.Runtime; using System; Runtime.PythonDLL = @"*my python311.dll path*"; PythonEngine.Initialize(); using (Py.GIL()) { // 获取程序运行的输出目录(确保脚本已复制到这里) string scriptDirectory = AppDomain.CurrentDomain.BaseDirectory; // 导入sys模块并添加目录到搜索路径 var sys = Py.Import("sys"); sys.GetAttr("path").InvokeMethod("append", new PyString(scriptDirectory)); // 现在可以正常导入自定义模块 var recognizerModule = Py.Import("mypythonscript"); }
如果脚本不在输出目录(比如仍在项目根目录),可以用Path.GetFullPath(@"..\..\..\")这类路径回到项目根,替换上面的scriptDirectory。
2. 确保Python脚本被复制到输出目录
在Visual Studio中右键mypythonscript.py文件,选择属性,将复制到输出目录设置为如果较新则复制或始终复制。这一步是关键,否则编译后输出目录里没有脚本文件,自然无法导入。
补充排查点
- 验证
sys.path内容:可以在代码中打印sys.path确认目录是否已添加,比如Console.WriteLine(sys.GetAttr("path")); - 避免相对导入:不要用
from . import mypythonscript这类相对导入,嵌入场景下模块的上下文可能不符合预期。
内容的提问来源于stack exchange,提问作者Mihash
相关产品推荐
相关产品推荐

