python通过telnet会话在行末持续报告"无效语法

3 投票
1 回答
1206 浏览
提问于 2025-04-18 02:29

在通过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。

我发现有一个问题描述了类似的情况,在这里,但是设置PYTHONUNBUFFERED=NO并没有解决问题。

而且,当直接与python解释器交互时(也就是不通过telnet),不会出现这样的错误。

我怀疑这可能与telnet发送行结束符的方式有关。我尝试在telnet会话中切换“toggle crlf”,将回车键的格式从<CR><NUL>改为<CR><LF>,但也没有帮助。

任何帮助、想法或建议都非常感谢!

祝好, Carsten

1 个回答

2

我自己找到了原因,所以给未来搜索的人一个提示:

当你在使用telnet时,每次输入命令并按下键,它会自动在命令后面加一个回车符(CR)。但是,Python解释器不接受这个回车符(\r),所以会报语法错误。这个回车符是不可见的,可能在Python生成的错误信息中看不到。

你可以参考这里:https://discussions.apple.com/thread/855998

对我来说,解决办法是使用一个不同的工具来进行通信,这里我用了netcat。

nc -v localhost 5092 

它打开了一个类似telnet的会话,但不会自动在命令后加回车符。这样就可以正常工作了!

撰写回答