在Python和C#之间传递数据而不写文件
我想在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#那边不管用的其他方法。我在某些方面有一点小成功,但我改动了太多,已经不记得哪些方法有效。有人能给我一点提示,告诉我哪些部分可能最有效,或者这是否真的可行吗?
我想传递的数据中包含空字符和其他不可打印的字符。
2 个回答
1
一种可能的解决办法是使用类似于Python for .NET的工具,它可以让C#和标准的Python(也就是C语言版的Python)直接互相操作。
根据你的Python程序需要做的事情,IronPython也是一个不错的选择,因为它可以直接在C#中使用。
这两种方法都不需要通过命令行来沟通,因为你可以直接在.NET中访问Python对象,反之亦然。
4
这段Python代码是正确的
p = Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = p.communicate(blob)
在C#这边,我让它正常工作了
Stream ms = Console.OpenStandardInput();