1

Python インタープリターを組み込んだ C プログラムで、TCP ソケットを介して Python 対話型コンソールを生成します。

import socket
import code
import sys

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 2000))
s.listen(1)
c = s.accept()[0] # client socket

def sread(s, len):
        return s.recv(len)
def swrite(s, str):
        return s.sendall(str)
def sreadline(s):
        return sread(s, 256) # lazy implementation for quick testing
socket.socket.read = sread
socket.socket.write = swrite
socket.socket.readline = sreadline
sys.stdin = c
sys.stdout = c
sys.stderr = c
code.interact() # runs the interactive console

これは基本的に機能します。ただし、対話型コンソールは、ユーザー入力ステートメントの結果を返すときに行末文字を発行することはありません。つまり、次のようなものが得られます。

nc localhost 2000
Python 2.7.3 (default, Sep 26 2012, 21:53:55) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 1+1
2>>> 

ユーザー入力 '1+1' に応答してインタープリターが結果 '2' を送信した後、次のプロンプト '>>>' の前に CR-LF が表示されません。行末文字 (CR および/または LF) がないことは、ソケットのユーザー側の出力を 16 進数で調べるか、関数 swrite( でソケットに書き込まれようとしている文字列を調べることによって確認されます。 )。

対話型コンソールで行末文字が発行されないのはなぜですか?

それは修正できますか?

4

2 に答える 2

1

これはsoftspace、Python がいつ改行を送信するかを決定する file 属性と関係があり、Python が正しく機能するために書き込み可能である必要があります。

「読み取り専用」ソケット オブジェクトに設定sys.stdoutしているため、属性を設定できず、テキスト出力で問題が発生します。

他のメソッドと同じ方法で__getattr__andメソッドを定義することで修正できますが、これは完全なハックであるため、「ラッパー」ソリューションを使用することをお勧めします。__setattr__

于 2013-04-23T11:15:22.760 に答える