在不编写文件的情况下在Python和C#之间传递数据

时间:2014-03-04 19:05:45

标签: c# python stdout stdin inter-process-communicat

我想在Python和C#之间传递二进制信息。我假设您可以打开一个标准的输入/输出通道,并像文件一样读写它,但是有很多可移动的部分,我不太了解C#。我想做这类事情,但不写文件。

# python code
with open(DATA_PIPE_FILE_PATH, 'wb') as fid:
    fid.write(blob)
subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH)
with open(DATA_PIPE_FILE_PATH, 'rb') as fid:
    'Do stuff with the data'

// C# code
static int Main(string[] args){
    byte[] binaryData = File.ReadAllBytes(DataPipeFilePath);
    byte[] outputData;
    // Create outputData
    File.WriteAllBytes(outputData)

我已经尝试了几种使用标准输入/输出的不同方法,但我没有运气匹配,就像我说的那样,有许多活动部件。我尝试过像

这样的事情
p = subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write(blob)
p.stdin.close()

p = subprocess.Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = p.communicate(blob)

在python端与

一起
TextReader tIn = Console.In;
TextWriter tOut = Console.Out;
String str = tIn.ReadToEnd();
//etc...

以及其他一些在C#方面无法解决的问题。我在某些方面取得了一些成功,但我已经改变了很多,以至于我不记得什么对什么有效。有人可以给我一个关于哪些部件能够发挥最佳效果的提示,或者这是否可行?

我要传递的数据包含null和其他不可打印的字符。

2 个答案:

答案 0 :(得分:3)

这个python代码是正确的

p = Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = p.communicate(blob)

在C#方面,我让它与

一起工作
Stream ms = Console.OpenStandardInput();

答案 1 :(得分:2)

一种可能性是使用类似Python for .NET的东西,它在C#和(标准,C)Python之间直接提供互操作。

根据您的Python例程需要做的事情,IronPython也可以是一个不错的选择,因为它可直接在C#中使用和使用。

这两个选项都避免尝试通过命令行进行通信,因为您可以直接从.NET访问Python对象,反之亦然。