Can Python read from a Windows Powershell namedpipe?
Question: I have the following named pipe created in Windows Powershell.

    
    
    # .NET 3.5 is required to use the System.IO.Pipes namespace
    [reflection.Assembly]::LoadWithPartialName("system.core") | Out-Null
    $pipeName = "pipename"
    $pipeDir = [System.IO.Pipes.PipeDirection]::InOut
    $pipe = New-Object system.IO.Pipes.NamedPipeServerStream( $pipeName, $pipeDir )
    

Now, what i need is some Python code snippet to read from the above named pipe
created. Can Python do that ?

Thanks in advance !


Answer: Courtesy :<http://jonathonreinhart.blogspot.com/2012/12/named-pipes-between-c-
and-python.html>

Here's the C# Code

    
    
    using System;
    using System.IO;
    using System.IO.Pipes;
    using System.Text;
    class PipeServer
    {
        static void Main()
        {
            var server = new NamedPipeServerStream("NPtest");
    
            Console.WriteLine("Waiting for connection...");
            server.WaitForConnection();
    
            Console.WriteLine("Connected.");
            var br = new BinaryReader(server);
            var bw = new BinaryWriter(server);
    
            while (true)
            {
                try
                {
                    var len = (int)br.ReadUInt32();            // Read string length
                    var str = new string(br.ReadChars(len));    // Read string
    
                    Console.WriteLine("Read: \"{0}\"", str);
    
                    //str = new string(str.Reverse().ToArray());  // Aravind's edit: since Reverse() is not working, might require some import. Felt it as irrelevant
    
                    var buf = Encoding.ASCII.GetBytes(str);     // Get ASCII byte array     
                    bw.Write((uint)buf.Length);                // Write string length
                    bw.Write(buf);                              // Write string
                    Console.WriteLine("Wrote: \"{0}\"", str);
                }
                catch (EndOfStreamException)
                {
                    break;                    // When client disconnects
                }
            }
        }
    }
    

And here's the Python code:

    
    
    import time
    import struct
    
    f = open(r'\\.\pipe\NPtest', 'r+b', 0)
    i = 1
    
    while True:
        s = 'Message[{0}]'.format(i)
        i += 1
    
        f.write(struct.pack('I', len(s)) + s)   # Write str length and str
        f.seek(0)                               # EDIT: This is also necessary
        print 'Wrote:', s
    
        n = struct.unpack('I', f.read(4))[0]    # Read str length
        s = f.read(n)                           # Read str
        f.seek(0)                               # Important!!!
        print 'Read:', s
    
        time.sleep(2)
    

Convert the C# code into a .ps1 file.

