Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python错误处理&;连接错误_Python_Bukkit_Telnetlib - Fatal编程技术网

Python错误处理&;连接错误

Python错误处理&;连接错误,python,bukkit,telnetlib,Python,Bukkit,Telnetlib,我在一个Telnet客户端上工作。我开始在我的笔记本(Windows)上编码,最后我把它上传到我的服务器(Debian)上。这两个系统都使用Python3。在我的笔记本上,脚本运行良好,但在Debian上,它确实会出错 守则: import telnetlib import sys try: HOST = sys.argv[1] user = sys.argv[3] password = sys.argv[4] cmd= sys.argv[5] port=

我在一个Telnet客户端上工作。我开始在我的笔记本(Windows)上编码,最后我把它上传到我的服务器(Debian)上。这两个系统都使用Python3。在我的笔记本上,脚本运行良好,但在Debian上,它确实会出错

守则:

import telnetlib
import sys
try:
    HOST = sys.argv[1]
    user = sys.argv[3]
    password = sys.argv[4]
    cmd= sys.argv[5]
    port=int(sys.argv[2])

    tn = telnetlib.Telnet(HOST, port)

    tn.read_until(b"username: ")
    tn.write(user.encode('ascii') + b"\n")
    if password:
        tn.read_until(b"password: ")
        tn.write(password.encode('ascii') + b"\n")

    tn.write(cmd.encode('ascii') + b"\n")
except ConnectionRefusedError:
    print('ERROR')
else:
    print('OK')
服务器(带RemoteToolKit的CraftBukkit服务器):

米尼问候

编辑:错误处理现在可以工作了!THX@Wojciech Walczak
客户端不报告错误,但服务器报告错误。如果在Windows上运行相同的代码,则不会出错。

服务器脱机时进行回溯的原因是您试图捕获一个不存在的异常(也就是说,尚未为名称
ConnectionRefusedError
分配值)

仅出于教育目的,我将删除“try…”。。。“除了…”并让错误被引发,然后希望您能够准确地找到引发的异常


至于Java回溯,WTF?

…您确定您使用的是Python 3.3或更高版本吗?
ConnectionRefusedError
已添加到Python 3.3中

编辑:


考虑到您的客户端在从笔记本电脑启动时工作正常,并且正在另一台计算机上捕获
ConnectionRefuedError
,我认为问题不在于脚本本身。而在于服务器的telnet/防火墙设置。其他telnet客户端是否在脚本失败的环境中工作?

错误在脚本中。Linux上的telnet命令运行得很好。

我运行代码时没有尝试和例外,它不会报告错误

我用字节字符串做了一些测试

如果我运行此代码,机器将显示不同的字符串

命令:

print(b"Hello there!")
窗口:

b"Hello there!"
Linux:

Hello there!
Debian的更新代码(Windows仍使用旧代码):

我在Windows上测试了代码,telnet服务器可以运行这些命令。
当我在Debian上运行代码时,它并没有说什么,但服务器说“连接重置”。

你绝对确定你正在Debian上的
python3
中运行脚本吗?是的,我使用cmd python3。我现在将Python更新为3.3.4。一个问题解决了!您能在不使用try/except子句的情况下运行代码并进行完全回溯吗?没有错误,我认为问题在于字节字符串。我假定服务器端仍然存在错误?如果是这样,当您在telnet客户端中删除
b
时会发生什么?(请在下面回答我的评论。)服务器端没有错误。我用油灰测试了服务器<代码>tn.write(b'say Hi')可以工作的
tn.write(“say Hi”.encode('ascii'))
没有任何问题,然后?回溯(最近一次调用):文件“UDPClient.py”,第12行,在tn.read\u中(“用户名:”)文件“C:\Python33\lib\telnetlib.py”,第299行,在read\u中,直到返回self。\ read\u直到您选择(匹配,超时)文件“C:\Python33\lib\telnetlib.py”,第352行,在_read_until_和_selecti=self.cookedq.find(match)TypeError:Type str不支持缓冲区api回溯表明问题出在
tn.read_until()
函数中,而不是
tn.write()中
函数。您能用当前代码和当前错误更新原始消息吗?一般来说,您现在看到的错误是字节和字符串混合的问题。请尝试:
b'str1,str2'.find('str')
b'str1,str2'.find(b'str')
Hello there!
import telnetlib
import sys
if(True):
    HOST = sys.argv[1]
    user = sys.argv[3]
    password = sys.argv[4]
    cmd= sys.argv[5]
    port=int(sys.argv[2])

    tn = telnetlib.Telnet(HOST, port)

    tn.read_until(b"username:")
    tn.write(user.encode('ascii') + b"\n")
    if password:
        tn.read_until(b"password:")
        tn.write(password.encode('ascii') + b"\n")

    tn.write(cmd.encode('ascii') + b"\n")