Найти - Пользователи
Полная версия: Использование скриптов Python в C#
Начало » Python для новичков » Использование скриптов Python в C#
1
Painkiller
В общем есть такая проблема.

Консольное дотнет приложение запускает Питона, перенаправляет на его стандартный ввод скрипт, который рисует график.

using System;
using System.Diagnostics;
using System.Threading;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
static Process prc = new Process();
static void Main(string[] args)
{

prc.StartInfo.FileName = "c:/Python27/python.exe";
prc.StartInfo.Arguments = "";
prc.StartInfo.UseShellExecute = false;
prc.StartInfo.RedirectStandardInput = true;
//prc.StartInfo.RedirectStandardError = true;
//prc.StartInfo.RedirectStandardOutput = true;
prc.Start();

StreamWriter buf = prc.StandardInput;

buf.WriteLine("import matplotlib.pyplot as plt");

buf.WriteLine("plt.plot([1,3,2,4])");

buf.WriteLine("plt.show()");

buf.Close();

Console.ReadLine();

}
}
}
Проблема, которую не могу решить вот в чём - без “buf.Close();” этот код не работает. А мне хочется перерисовывать график, не открывая новый экземпляр Питона.
Вторая проблема в том, что мне вообще не удаётся подключится к стандартному выводу Питона.
Isem
Я не специалист по C#, но по идее у потокадолжна быть функция Flush: buf.Flush(). Это чтобы загнать питону все, что накопилось в потоке, ибо у него (у потока) есть свой собственный буфер.
Painkiller
Пробовал - не работает. Только освобождение потока или закрытие приложения срабатывает.
regall
А почему не используете IronPython и иже с ним?
Painkiller
regall
А почему не используете IronPython и иже с ним?
Под него половины библиотек нету. Начиная от numpy.
Isem
Вот здесь та же сама проблема:
http://www.rsdn.ru/forum/dotnet/2731419.flat.aspx
Painkiller
Isem
Вот здесь та же сама проблема:
http://www.rsdn.ru/forum/dotnet/2731419.flat.aspx
И она тоже не решена.
Painkiller
Кое что начало вырисовываться. Консоль Питона - это не стандартный ввод/вывод, увы.
Чтобы получить данные из питона через стандартный консольный вывод нужно делать что-то вроде:
where = sys.stdout
print >>where, ‘что на выход’
Осталось понять как достучаться до консоли питона.
Painkiller
Итак, проблема успешно решена.
Вместо вызова консоли Питона, я запускаю в нём файл состоящий всего из трёх строк:
import sys
while True:
exec sys.stdin.readline()
Painkiller
При желании можно ввести в переменную, которая будет выводить этот цикл из бесконечности, но проще прибивать процесс питона из родительского приложения.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB