我正在使用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