<div>Hi everyone.<br></div><div><br></div><div>I&#39;ve been trying to implement from the examples in <a href="http://github.com/ellisonbg/pyzmq">pyzmq</a> the support for raw_input calls, to be used in IPthonZMQ and IPythonQt projects.</div>
<div>Nothing goo has come from this attempts but a better understanding of what I don&#39;t understand. Here&#39;s a guide through my last thoughts so you can help me:</div><div><br></div><div>firs I wanted to add to this line(154) in the kernel, a new type of request:</div>
<div><strong><br></strong></div><div><strong>for msg_type in [&#39;execute_request&#39;, &#39;complete_request&#39;,&#39;</strong><font color="#ff0000"><strong>raw_input_request</strong></font><strong>&#39;]:</strong><strong><br>
</strong><strong>                self.handlers[msg_type] = getattr(self, msg_type)</strong><br></div><div><br></div><div>Also I need to add a function:</div><div><strong><br></strong></div><div><strong>def raw_input_request(self,ident,parent):</strong></div>
<div><strong>   print&gt;&gt;sys.__stdout__,&quot;entered&quot;</strong></div><div><strong><br></strong></div><div>Just to check if the messages thread gets there (Which it doesn&#39;t).<strong><br></strong></div><div>The class RawInput is as it was always.</div>
<div>And obviously the overwriting of the raw_input function in main():</div><div><br></div><div><strong>rawinput=RawInput(session,pub_socket)<br>    __builtin__.raw_input=rawinput</strong><br></div><div><strong><br></strong></div>
<div>Now for the frontend part, I need also a msg_type:<strong><br></strong></div><div><br></div><div><strong>for msg_type in [&#39;pyin&#39;, &#39;pyout&#39;, &#39;pyerr&#39;, &#39;stream&#39;,&#39;<font color="#ff0000">raw_input</font>&#39;]:<br>
                self.handlers[msg_type] = getattr(self, &#39;handle_%s&#39; % msg_type)</strong><br></div><div><br></div><div>And a handler for raw_input type of messages:</div><div><br></div><div><strong>def handle_raw_input(self,omsg):<br>
            stdin_msg=sys.stdin.readline()<br>            src=stdin_msg<br>            self.session.send(self.request_socket,&#39;raw_input_request&#39;,dict(code=src))</strong><br></div><div><br></div><div>As you can see this is just to send the raw_input request with the line written by the user.</div>
<div>The error is this:</div><div><br></div><div><strong>&lt;class &#39;zmq._zmq.ZMQError&#39;&gt; : Operation not supported<br>Traceback (most recent call last):<br>  File &quot;./kernel.py&quot;, line 194, in execute_request<br>
    exec comp_code in self.user_ns, self.user_ns<br>  File &quot;&lt;zmq-kernel&gt;&quot;, line 1, in &lt;module&gt;<br>  File &quot;./kernel.py&quot;, line 126, in __call__<br>    reply=self.socket.recv_json()<br>  File &quot;_zmq.pyx&quot;, line 906, in zmq._zmq.Socket.recv_json (zmq/_zmq.c:6862)<br>
  File &quot;_zmq.pyx&quot;, line 751, in zmq._zmq.Socket.recv (zmq/_zmq.c:5316)<br>  File &quot;_zmq.pyx&quot;, line 781, in zmq._zmq.Socket._recv_copy (zmq/_zmq.c:5690)<br>ZMQError: Operation not supported</strong><br></div>
<div><strong><br></strong></div><div>It says that the error is in <em><strong>exec</strong> comp_code <strong>in</strong> self.user_ns, self.user_ns</em>, which is in the execute_request function</div><div><br></div><div>
{u&#39;content&#39;: {u&#39;code&#39;: u&#39;raw_input()&#39;},                                                                                                                <br> u&#39;header&#39;: {u&#39;username&#39;: u&#39;muzgash&#39;, u&#39;msg_id&#39;: 0, u&#39;session&#39;: u&#39;264d21d4-7e00-4b7e-b051-3c0ba7b221f6&#39;},<br>
 u&#39;msg_type&#39;: u&#39;<font color="#ff0000">execute_request</font>&#39;,<br> u&#39;parent_header&#39;: {}}<br></div><div><br></div><div>{&#39;content&#39;: {u&#39;status&#39;: u&#39;<font color="#ff0000">error</font>&#39;, u&#39;etype&#39;: u&quot;&lt;class &#39;zmq._zmq.ZMQError&#39;&gt;&quot;, u&#39;evalue&#39;: u&#39;Operation n..........</div>
<div><br></div><div>so I can say that the error is in the first message sent by the frontend to the kernel, but the raw_input function is called ( RawInput.__call__() ) and also a message is sent to the frontend through:</div>
<div><br></div><div>msg = self.session.msg(u&#39;raw_input&#39;)<br>        self.socket.send_json(msg)<br></div><div><br></div><div>and the function handle_raw_input is called, which sends a new message to the kernel</div>
<div><br></div><div>{u&#39;content&#39;: {u&#39;code&#39;: u&#39;input--&gt;\n&#39;},<br> u&#39;header&#39;: {u&#39;username&#39;: u&#39;muzgash&#39;, u&#39;msg_id&#39;: 1, u&#39;session&#39;: u&#39;264d21d4-7e00-4b7e-b051-3c0ba7b221f6&#39;},<br>
 u&#39;msg_type&#39;: u&#39;<font color="#ff0000">raw_input_request</font>&#39;,<br> u&#39;parent_header&#39;: {}}<br></div><div><br></div><div>so this line in the class RawInput should recieve it:</div><div><br></div><div>
while True:<br>                try:<br>                        reply = self.socket.recv_json(zmq.NOBLOCK)<br></div><div><br></div><div>But it doesn&#39;t.</div><div><br></div><div>That&#39;s one thing.</div><div>Another one is that for this to work well in the Qt frontend I need to fix pyout (keeping off course multiline input) which I have no clue how to do it.</div>
<div>I could write a pretty crude fix with Qt and without requesting the kernel twice, but no _NN call will work and it will have to be rewritten when this problems are solved.</div><div>So I think for now I&#39;ll move on to the next point in the schedule &#39;till some ideas popup.</div>
<div><br></div><div><br></div><div>thanks in advance.</div><div><br></div><div><font color="#888888"><br><br>Best regards.<br>--<br><a href="http://he1.udea.edu.co/gweb" target="_blank">Gerardo Gutiérrez Gutiérrez</a><br>
Physics student<br>Universidad de Antioquia<br>Computational physics and astrophysics group (<a href="http://urania.udea.edu.co/sites/sites.php" target="_blank">FACom</a>)<br>


Computational science and development branch(<a href="http://urania.udea.edu.co/sites/facom-dev/" target="_blank">FACom-dev</a>)<br>Usuario Linux #492295</font><br><br>
<br>
<br></div><div><br></div>