python通过telnet会话在行尾保持报告“无效语法”

时间:2014-04-12 12:09:20

标签: python telnet

通过telnet会话打开python解释器时,发送的每个命令都会被“SyntaxError:invalid syntax”拒绝。 如何通过telnet会话成功发送命令?

实施例: 启动以交互模式提供python解释器的服务器:

socat TCP-LISTEN:5092 EXEC:'python -i' 

连接telnet并从telnet会话发送命令:

>telnet localhost 5092
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
print "test"

在服务器端产生以下结果:

>socat TCP-LISTEN:5092 EXEC:'python -i' 
Python 2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>   File "<stdin>", line 1
    print "test"
                ^
SyntaxError: invalid syntax
>>> 

我在Mac OS X 10.9.2上的两个独立的终端窗口中运行所有这些。 Python版本2.7.5。

我发现了一个描述类似问题here的问题,然而,设置PYTHONUNBUFFERED = NO没有帮助。

此外,当直接与python解释器交互时(即不通过telnet),不会发生此类错误。

我的怀疑是已经过了。与telnet发送行结尾的方式有关。尽管如此,尝试在telnet会话中“切换crlf”以从输入键的<CR><NUL>切换到<CR><LF>也无济于事。

非常感谢任何帮助/想法/想法!

干杯, 卡斯滕

1 个答案:

答案 0 :(得分:2)

我自己找到了原因,所以对于未来的搜索者来说:

telnet会在输入的每个命令后自动添加CR,并使用&lt; enter&gt;发送。但是,python解释器不接受CR(\ r)作为命令的一部分,并报告该字符的语法错误(\ r \ n是不可打印的,因此可能在python生成的错误消息中不可见)。 另见:https://discussions.apple.com/thread/855998

我的解决方案是使用与telnet不同的工具进行通信:在这种情况下为netcat。

nc -v localhost 5092 

打开一个类似telnet的会话,其中CR不会自动添加到命令中。它有效!