sounds great;
one additional suggestion,  don't just use a plane jane .net text box, but 
instead use  a 'rich text box'.  why?  i have used it again and again in smart 
terminal emulator windows where properties like 'append' are built in, plus it 
is easy to build in self scrolling, and colored prompts for different data i.e. 
>>>output, <<<input, !!error, || configuration, ect.
cheers
 “The desire that guides me in all I do is the desire to harness the forces of 
nature to the service of mankind. ”Nikola Tesla“Radio Power Will Revolutionize 
the World” (Modern Mechanix & Inventions, July, 1934) 

    On Friday, May 27, 2016 3:41 PM, Saparya K <spry...@gmail.com> wrote:
 

 Just in case someone stumbles on this post looking for an answer:A solution 
that worked for me was redirecting the Python stdout/stderr to a stream in 
Python. I was then able to route this stream into the .NET text box.private 
void button1_Click(object sender, EventArgs e)
{
    using (Py.GIL())
    {
        // Redirect stdout to text box
        dynamic sys = PythonEngine.ImportModule("sys");

        string codeToRedirectOutput =
            "import sys\n" +
            "from io import StringIO\n" +
            "sys.stdout = mystdout = StringIO()\n" +
            "sys.stdout.flush()\n" +
            "sys.stderr = mystderr = StringIO()\n" +
            "sys.stderr.flush()\n";
        PythonEngine.RunString(codeToRedirectOutput);            

        // Run Python code
        string pyCode = "print(1 + 2)";
        PyObject result = PythonEngine.RunString(pyCode); // null in case of 
error
        if (result != null)
        {
            string pyStdout = sys.stdout.getvalue(); // Get stdout
            pyStdout = pyStdout.Replace("\n", "\r\n"); // To support newline 
for textbox
            textBox1.Text = pyStdout;             
        }
        else
        {
             PythonEngine.PrintError(); // Make Python engine print errors
             string pyStderr = sys.stderr.getvalue(); // Get stderr
             pyStderr = pyStderr.Replace("\n", "\r\n"); // To support newline 
for textbox
             textBox1.Text = pyStderr;
        }     
    }
}With this code, I was able to redirect the stdout (and stderr in the case of 
an error) from the Python engine to a .NET text box.
On Wed, May 18, 2016 at 12:02 AM, Saparya K <spry...@gmail.com> wrote:

Hi Denis,Thanks for pointing me to the new API. I am now able to embed Python 
in my C# code and access Python classes and methods from C#!
Hi Nils,Your application looks very interesting and some of the features (e.g. 
matplotlib integration) are on the lines of what I have been thinking about. I 
am far from there though and will need to learn more before I can follow all 
the code in your wrapper!
-----
As of now, I am trying to redirect the output from the Python interpreter to a 
.NET text box. While I am able to redirect the output to a file, I am having 
trouble with routing the output to a text box. 
I first tried to redirect the console output to a custom TextWriter using 
Console.SetOut in C#:

private void Form1_Load(object sender, EventArgs e){    _writer = new 
TextBoxWriter(this.textBox1);    Console.SetOut(_writer);    // Redirect stdout 
to custom TextWriter that writes to the text box}
This did not work: while output from C# is routed to the text box, output from 
Python is not.
-----

I then thought that maybe I need to redirect the Python stdout instead of the 
C# standard output. The idea was to assign Python's sys.stdout to a .NET object 
that implements the same interface as a python stream (write(), 
writelines()...):
.NET class to mimic Python stream:   
   -    public class TextBoxStream : PyObject // To assign to sys.stdout. Is 
this correct?
{
    private TextBox _output = null;            

    public TextBoxStream() {}

    public TextBoxStream(TextBox output) {
        _output = output;
    }

    void write(object value) {
        _output.AppendText(value.ToString());
    }
}In Form1.cs:   private void button1_Click(object sender, EventArgs e) {
    using (Py.GIL())
    {
        // Redirect stdout to text box
        dynamic sys = PythonEngine.ImportModule("sys");
        TextBoxStream textBoxStream = new TextBoxStream(textBox1);
        sys.stdout = textBoxStream; // This is probably not theright way?
        //sys.SetAttr("stdout", textBoxStream); // This did not work either

        string code =
            "import sys\n" +
            "print 'Message 1'\n" +
            "sys.stdout.write('Message 2')\n" +
            "sys.stdout.flush()";

        PyObject redirectPyObj = PythonEngine.RunString(code); // returns NULL
        sys.stdout.write("Message 3"); 
        // Exception thrown: 'Python.Runtime.PyObject' does not contain a 
definition for 'stdout'
    }
}
This does not work either: redirectPyObj is NULL. I tried using the old as well 
as the new Python.NET API (with dynamic). Neither the sys.stdout.write nor the 
print statements write to the text box.Any ideas on how to approach this would 
be very helpful.Thanks,Saparya

On Tue, May 17, 2016 at 3:33 AM, Nils Becker <nilsc.bec...@gmail.com> wrote:

Hey,
a while ago I wrote something like a light wrapper around Python.NET to embed 
CPython with numpy/scipy in a .NET GUI. It manages local/global dictionaries, 
automatically converts simple data types and numpy arrrays<->C# arrays and 
provides a plotting widget in C# that shows matplotlib plots. It also has some 
other convenience functions.
The code is by no means complete, fully tested or even nice. However, for me it 
works.
I uploaded it to github: https://github.com/Lodomir/PythonInterfaceAs it 
demonstrates some not-well documented use of Python.NET, I thought it maybe 
nice to share the code.
You will need to add the references to Python.NET to build the main project 
(PythonInterface) and additionally to the PythonInterface-DLL to build the 
examples.
CheersNils
2016-05-13 22:04 GMT+02:00 Denis Akhiyarov <denis.akhiya...@gmail.com>:

for embedding look at c# embedding unit tests and also here:
1. Old API:
http://pythonnet.github.io/readme.html

2. New simplified API using dynamic:
https://github.com/pythonnet/pythonnet/blob/master/README.md



On Thu, May 12, 2016 at 4:16 PM, Saparya K <spry...@gmail.com> wrote:

Thanks for your response, Denis. 
I had not come across Sho earlier. It looks very interesting. (If only Python 
3.x support was available, though it does look like they have added support for 
their own math and visualization libraries). 

I am going over the demos and the unit tests and I was able to write a simple 
console application to access .NET objects from Python. This is very 
encouraging! I am still figuring out how to embed Python code in my C# WinForms 
application (instead of a console application).
I will continue my experiments, but in the meantime if you or anyone else has 
any ideas on how to redirect the result from the Python interpreter (say, to a 
rich text box), I would love to hear them. That is one part of the puzzle that 
is unclear to me.
Thanks,Saparya
On Wed, May 11, 2016 at 4:01 PM, Denis Akhiyarov <denis.akhiya...@gmail.com> 
wrote:

This is definitely possible with WinForms or WPF. See the demo folder in 
pythonnet repo. One of the demo's is still in pull request.
You should probably just try running previous IronPython attempts using 
pythonnet and report issues if any. Have a look at Sho from Microsoft.
There is someone trying to embed ipython REPL using pythonnet/Excel-DNA or COM 
in Excel with Custom Task Pane (CTP) written in WinForms:
https://groups.google.com/forum/#!topic/jupyter/CVht4orvQtc





On Wed, May 11, 2016 at 4:44 PM, Saparya K <spry...@gmail.com> wrote:

Hello PythonNet,
I am looking to embed a Python interactive (REPL) shell in a .NET WinForms 
application.This C# application displays a graphical visualization of some 
data. Methods to manipulate the data in the C# application would be exposed via 
a Python API.The idea is to be able to interact with the data from the Python 
shell via the API, and thereby updating the graphical view. 

Ideally, the shell should support any valid Python syntax that is required to 
use the API. This would involve:
   
   - Querying a collection of data from the application via the Python API
   - Then manipulating this collection in the Python shell
   - Making API calls with the modified collection as an argument
I came across a few examples where an interactive shell was developed using 
IronPython. A limitation with this approach is the absence of Python 3.x 
support (and other C-compiled libraries) in IronPython. For this reason, I 
would prefer to use Python.NET if it is possible.
Has anyone here tried something like this with Python.NET before? Does it looks 
like what I am trying to achieve is feasible?

Any direction would be very helpful!
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet



_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet



_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet



_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet



_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet





_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet

  
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet

Reply via email to