Передача данных между 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)
на стороне питона вместе с
TextReader tIn = Console.In;
TextWriter tOut = Console.Out;
String str = tIn.ReadToEnd();
//etc...
а также несколько других вещей, которые не работали на стороне C#. У меня был небольшой успех с некоторыми вещами, но я изменил его настолько, что не помню, что сработало для чего. Может ли кто-нибудь дать мне подсказку о том, какие части будут работать лучше, или если это вообще возможно?
Данные, которые я хочу передать, содержат ноль и другие непечатаемые символы.
2 ответа
Этот код Python был правильным
p = Popen(C_SHARP_EXECUTABLE_FILE_PATH, stdout=PIPE, stdin=PIPE, stderr=PIPE)
out, err = p.communicate(blob)
И на стороне C#, я получил его для работы с
Stream ms = Console.OpenStandardInput();
Одна возможность - использовать что-то вроде Python для.NET, которая обеспечивает взаимодействие непосредственно между C# и (стандартным, C) Python.
В зависимости от того, что должны делать ваши подпрограммы Python, IronPython также может быть хорошим вариантом, так как он непосредственно потребляем и используется из C#.
Обе эти опции избегают попыток связи через командную строку, так как у вас есть прямой доступ к объектам Python из.NET, и наоборот.