C# 在.NETC中集成Python脚本#

C# 在.NETC中集成Python脚本#,c#,python,.net,nltk,ironpython,C#,Python,.net,Nltk,Ironpython,我正在尝试使用IronPython作为桥梁,在.NET平台上集成一个相当复杂的Python脚本 在我的python脚本中,我使用NLTK和其他一些字符串分类器,如sklearn.naive_bayes,这是我的导入: import nltk from nltk.classify.scikitlearn import SklearnClassifier import pickle from sklearn.naive_bayes import MultinomialNB, BernoulliN

我正在尝试使用IronPython作为桥梁,在.NET平台上集成一个相当复杂的Python脚本

在我的python脚本中,我使用NLTK和其他一些字符串分类器,如
sklearn.naive_bayes
,这是我的导入:

import nltk

from nltk.classify.scikitlearn import SklearnClassifier
import pickle

from sklearn.naive_bayes import MultinomialNB, BernoulliNB

from sklearn.linear_model import LogisticRegression, SGDClassifier
我在这个脚本中还有一个函数,它接收一个字符串作为参数,并返回一些输出示例:

def testFunction(text):
    #do some things
    return somethings
我想从.NET应用程序调用此函数,我使用以下代码调用此函数:

        ScriptEngine engine;
        ScriptScope scope;
        ScriptSource source;
        CompiledCode compiled;

        engine = Python.CreateEngine();
        scope = engine.CreateScope();

        ICollection<string> paths = engine.GetSearchPaths();
        string dir = @"C:\Users\Desktop\WinPython-64bit-3.4.3.6\python-3.4.3.amd64\Lib";
        paths.Add(dir);
        string dir2 = @"C:\Users\Desktop\WinPython-64bit-3.4.3.6\python-3.4.3.amd64\Lib\site-packages";
        paths.Add(dir2);

        engine.SetSearchPaths(paths);

        //loading and compiling code
        source = engine.CreateScriptSourceFromFile(@"C:\Users\Desktop\script.py");


        compiled = source.Compile();

        //now executing this code (the code should contain a class)
        compiled.Execute(scope);
我想用一个字符串调用
testFunction
,然后在.NET中使用该函数的输出。

Ok

在一些澄清的评论之后,我相信我现在敢于回答

Ironpython(目前)是Ironpython 2.7(对应于python 2.7) 从这一行:

很明显,您正在尝试从Python3.4加载模块

在评论中,有人提到Idle用于测试python脚本,但Idle将使用安装的python版本(或者如果安装了多个版本,则为每个版本安装一个Idle)

在本例中,您在python3.4中测试的空闲IDE使用了python3.4

Python2.x和Python3.x是两种不同的编程${接口/编译器/解释器}。用于编写脚本的语言并非100%相同

Python3与Python2不完全向后兼容。因为有些语法被修改了。(与.NET不同,在.NET中,编译器的新版本支持旧代码)

以下是一些关键区别的链接:

尝试使用ironPython3,而不是ironPython,根据我的经验,ironPython3还没有完全成熟,我还不会在生产环境中使用它,但是如果您确实依赖于Python3模块,并且需要将python作为与.Net兼容的脚本引擎运行,这是我的建议

否则,请帮自己一个忙,并研究寻找与2.x版兼容的相同python模块的选项 或者通过插入python版本标识块,自己修改它们


异常应具有行信息。你能把这个加到你的问题上吗?是否有任何库使用本机模块/库?这将是一个问题…据我所知,.NET部分没有任何问题。。因此,错误一定在python脚本中。你有没有尝试过一些更简单的方法,比如打印“test”,为什么不使用
过程
实例呢?@Simon Opelt行是this->compiled.Execute(scope);再想想。。。这似乎是多余的,但是。。。当您在Idle中测试时,Idle是否使用了python 3.4?-据我所知,ironpython3不完整,可能功能不全。如果您安装了IronPython2.7,然后指向Python3的nltk,这可能会给您带来问题。。
SyntaxErrorException -> unexpected token 'from'.
string dir = @"C:\Users\Desktop\WinPython-64bit-3.4.3.6\python-3.4.3.amd64\Lib";