IronPython 3.4.1调用NLTK模块报错:No module named 'nltk' 求解决
问题描述
使用NuGet的IronPython 3.4.1编写test.py,代码导入nltk并实现calculate_bleu函数;同时基于NUnit 3.1编写C#代码testME.cs,通过IronPython引擎执行该Python文件。已添加Python相关路径,但运行C#代码时抛出错误:
IronPython.Runtime.Exceptions.ImportException : No module named 'nltk'
已全局安装NLTK 3.5版本,控制台直接执行test.py可正常运行,需解决该导入问题。
test.py代码:
import nltk def calculate_bleu(reference, candidate): return nltk.translate.bleu_score.sentence_bleu(reference, candidate)
testME.cs核心代码:
[TestFixture] public class Test { [TestCase] public void TestIt() { ScriptEngine engine = Python.CreateEngine(); string dir = Path.GetDirectoryName(@"C:\Users\my_user\repository\test.py"); ICollection<string> paths = engine.GetSearchPaths(); if (!String.IsNullOrWhiteSpace(dir)) { paths.Add(dir); } else { paths.Add(Environment.CurrentDirectory); } paths.Add(@"c:\Users\my_user\AppData\Roaming\Python\Python311\site-packages\nltk\translate\bleu_score.py"); paths.Add(@"C:\Program Files\Python311"); paths.Add(@"C:\Program Files\Python311\Lib"); paths.Add(@"C:\Program Files\Python311\site-packages"); paths.Add(@"C:\Program Files\Python311\site-packages\nltk"); engine.SetSearchPaths(paths); ScriptScope scope = engine.CreateScope(); engine.ExecuteFile(@"C:\Users\my_user\repository\test.py", scope); dynamic testFunction = scope.GetVariable("calculate_bleu"); var result = testFunction("this is a dog", "this is a cat"); } }
解决方案
1. 修正IronPython搜索路径配置
IronPython的搜索路径仅支持目录,你当前错误添加了单个.py文件路径,需移除并调整为正确的目录:
// 移除错误的单个文件路径 // paths.Add(@"c:\Users\my_user\AppData\Roaming\Python\Python311\site-packages\nltk\translate\bleu_score.py"); // 添加正确的目录路径 paths.Add(@"C:\Program Files\Python311"); paths.Add(@"C:\Program Files\Python311\Lib"); paths.Add(@"C:\Program Files\Python311\site-packages"); // 补充用户目录下的site-packages(如果NLTK安装在此) paths.Add(@"c:\Users\my_user\AppData\Roaming\Python\Python311\site-packages");
2. 为IronPython单独安装NLTK
全局安装的NLTK是给CPython使用的,IronPython有独立的包环境。找到IronPython的ipy.exe(通常在NuGet包的IronPython/tools目录下),执行以下命令安装NLTK:
ipy.exe -m pip install nltk==3.5
安装完成后,IronPython会自动识别该包路径,无需手动添加全局CPython的路径。
3. 同步CPython的sys.path到IronPython
通过CPython获取标准的sys.path列表,将其同步给IronPython:
// 获取CPython的sys.path(可通过命令行执行python -c "import sys; print('\n'.join(sys.path))"获取) var cpythonPaths = new List<string> { @"C:\Program Files\Python311", @"C:\Program Files\Python311\Lib", @"C:\Program Files\Python311\site-packages", @"c:\Users\my_user\AppData\Roaming\Python\Python311\site-packages" }; foreach (var path in cpythonPaths) { if (!paths.Contains(path)) { paths.Add(path); } } engine.SetSearchPaths(paths);
4. 修正BLEU函数参数格式(额外修复)
即使解决导入问题,当前代码仍会因参数格式错误报错。sentence_bleu要求参考译文为二维列表,候选译文为一维单词列表,需修改代码:test.py调整:
import nltk from nltk.translate.bleu_score import sentence_bleu def calculate_bleu(reference, candidate): # 转换为单词列表格式 ref_list = [sent.split() for sent in reference] cand_list = candidate.split() return sentence_bleu(ref_list, cand_list)
C#调用调整:
// 参考译文传入字符串列表,候选传入单个字符串 var result = testFunction(new List<string>{"this is a dog"}, "this is a cat");
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

