Передача данных между 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, и наоборот.

Другие вопросы по тегам