使用IronPython无法正常使用来自C#的zmq执行python脚本

时间:2017-01-08 17:43:09

标签: c# python zeromq ironpython

我正在使用ZeroMQ进行C#托管应用程序和python脚本之间的进程间通信。从C#调用脚本时,使用IronPython我收到以下错误:

  

类型
的未处理异常   中文发生了 IronPython.Runtime.Exceptions.ImportException   Microsoft.Dynamic.dll

     

其他信息:无法从中导入常量   的 zmq.backend.cython

Python代码(test.py文件):

import sys, zmq, time

def execute(input):
    context = zmq.Context()

    publisher = context.socket(zmq.PUB)
    publisher.bind("tcp://*:18800")
    time.sleep(1)

    publisher.send(input) #just echo input parameter

这就是我从C#app执行.py代码的方式:

static void Main(string[] args)
{
    var options = new Dictionary<string, object>();
    options["Frames"] = true;
    options["FullFrames"] = true;

    ScriptEngine _engine = Python.CreateEngine(options);
    ScriptRuntime _runtime = _engine.Runtime;
    ICollection<string> _searchPaths = _engine.GetSearchPaths();

    _searchPaths.Add(@"C:\Python27\");
    _searchPaths.Add(@"C:\Python27\Lib\");
    _searchPaths.Add(@"C:\Python27\Scripts\");
    _searchPaths.Add(@"C:\Python27\libs\");
    _searchPaths.Add(@"C:\Python27\DLLs\");
    _searchPaths.Add(@"C:\Python27\include\");
    _searchPaths.Add(@"C:\Python27\lib\site-packages");

    _engine.SetSearchPaths(_searchPaths);

    dynamic wrapperObj = _runtime.UseFile("test.py");
    wrapperObj.execute("test");
}

请注意,为简洁起见,省略了一些代码,并且实际上与此方案无关。当通过命令行手动调用.py脚本时,一切正常,我能够传递数据并且我的C#app正在接收消息。

任何人都知道这个错误是什么以及如何解决?

EDIT : 虽然我绝望并且几乎放弃了,但我还是试着编写快速的命名管道支持,猜猜是什么 - 类似的错误:

  

中发生了类型为 IronPython.Runtime.Exceptions.ImportException 的未处理异常   Microsoft.Dynamic.dll

     

附加信息:没有名为win32file的模块

这一次,我的test.py看起来像这样:

import win32file

def execute(input):
    handle = win32file.CreateFile(r"\\.\pipe\test_pipe",
                                   win32file.GENERIC_WRITE,
                                   0, None,
                                   win32file.OPEN_EXISTING,
                                   0, None)

    if handle:
        win32file.WriteFile(self.handle, input, None)
        win32file.FlushFileBuffers(self.handle)
        win32file.SetFilePointer(self.handle, 0, win32file.FILE_BEGIN)

我不确定我是否有更多选择来实现这种互操作性,但我开始认为IronPython可以只涵盖基本的使用场景(从C#调用纯Python代码时),更不用说 matplotlib numpy astropy

提前致谢!

的问候,
CIVA

0 个答案:

没有答案