Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2010 17:20:40

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

В общем есть такая проблема.

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

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();” этот код не работает. А мне хочется перерисовывать график, не открывая новый экземпляр Питона.
Вторая проблема в том, что мне вообще не удаётся подключится к стандартному выводу Питона.



Отредактировано (Сен. 23, 2010 17:21:36)

Офлайн

#2 Сен. 23, 2010 17:31:20

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Я не специалист по C#, но по идее у потокадолжна быть функция Flush: buf.Flush(). Это чтобы загнать питону все, что накопилось в потоке, ибо у него (у потока) есть свой собственный буфер.



Отредактировано (Сен. 23, 2010 17:32:12)

Офлайн

#3 Сен. 23, 2010 17:32:48

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Пробовал - не работает. Только освобождение потока или закрытие приложения срабатывает.



Офлайн

#4 Сен. 23, 2010 17:44:28

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

А почему не используете IronPython и иже с ним?



Офлайн

#5 Сен. 23, 2010 17:46:10

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

regall
А почему не используете IronPython и иже с ним?
Под него половины библиотек нету. Начиная от numpy.



Офлайн

#6 Сен. 23, 2010 17:47:24

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Вот здесь та же сама проблема:
http://www.rsdn.ru/forum/dotnet/2731419.flat.aspx



Офлайн

#7 Сен. 23, 2010 17:50:29

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Isem
Вот здесь та же сама проблема:
http://www.rsdn.ru/forum/dotnet/2731419.flat.aspx
И она тоже не решена.



Офлайн

#8 Сен. 23, 2010 22:10:28

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Кое что начало вырисовываться. Консоль Питона - это не стандартный ввод/вывод, увы.
Чтобы получить данные из питона через стандартный консольный вывод нужно делать что-то вроде:
where = sys.stdout
print >>where, ‘что на выход’
Осталось понять как достучаться до консоли питона.



Офлайн

#9 Сен. 24, 2010 00:03:46

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

Итак, проблема успешно решена.
Вместо вызова консоли Питона, я запускаю в нём файл состоящий всего из трёх строк:

import sys
while True:
exec sys.stdin.readline()



Отредактировано (Сен. 24, 2010 08:26:54)

Офлайн

#10 Сен. 24, 2010 00:06:29

Painkiller
От:
Зарегистрирован: 2010-09-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование скриптов Python в C#

При желании можно ввести в переменную, которая будет выводить этот цикл из бесконечности, но проще прибивать процесс питона из родительского приложения.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version