python—为什么此代码不起作用

python—为什么此代码不起作用,python,client-server,Python,Client Server,我有Black Hat Python书中的以下代码,但它不起作用,我不知道为什么 def client_handler(client_socket): global command ... if command: while True: client_socket.send('<ncreplace:#> '.encode('utf-8')) cmd_buffer = ''

我有Black Hat Python书中的以下代码,但它不起作用,我不知道为什么

def client_handler(client_socket):
    global command

    ...

    if command:
        while True:
            client_socket.send('<ncreplace:#> '.encode('utf-8'))
            cmd_buffer = ''

            while '\n' not in cmd_buffer:
                cmd_buffer += str(client_socket.recv(1024))
                print('loop')

            response = run_cmd(cmd_buffer)

            client_socket.send(response.encode('utf-8'))

def run_cmd(command):
    print('command')
    command = command.strip()

    try:
        output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
    except:
        output = 'Failed to execute command.\r\n'

    return output

问题是:当我运行所有程序时,它应该是一些客户机-服务器应用程序,而这一部分应该在服务器端运行,当涉及到执行cliend\u handler方法时,它不调用run\u cmd方法。它只打印一次“循环”,但不打印“命令”。我已将这些打印语句放入调试中。有人能告诉我为什么吗?

这是您的问题,或者至少是一个使此代码无法工作的问题:

while '\n' not in cmd_buffer:
    cmd_buffer += str(client_socket.recv(1024))
假设这是Python3,recv返回一个字节。它大概包含UTF-8编码的文本。你需要解码。你可以通过调用decode来实现这一点,而不是str。str所做的在这里是错误的。例如:

>>> b = b'abc'
>>> print(b.decode())
abc
>>> print(str(b))
b'abc'
你不想看到b或那些角色

更重要的是,看看它对新行的作用:

>>> b = b'abc\ndef\n'
>>> print(b.decode())
abc
def

>>> print(str(b))
b'abc\ndef\n'
它以反斜杠和n的形式逃避每一个换行符。所以,当你一遍又一遍地问缓冲区中是否有换行符时,从来就没有


如果这段代码是为Python2编写的,并且最初没有str调用,那么将Python2代码移植到Python3可能比在停止获取异常之前随机抛出str和bytes调用要困难一些。这些文档已经发布了,尽管它实际上是为那些熟悉Python 2的人准备的,所以您可能希望搜索第三方教程,如。我不太清楚,这只是搜索中出现的第一个问题,但它看起来不错,至少涵盖了如何使用modernize和pylint,官方指南没有,至少上次我看时没有。

你有什么错误吗?我们需要错误日志等详细信息,你使用的是哪种翻译等等。我们最需要的是一个翻译。没有人可以运行此代码来调试发布的代码,所以任何人都可以猜测您可能会出错。尽管我有一个猜测:cmd_buffer+=strclient_socket.recv1024。这个str调用对于Python2是无用的,而对于Python3则完全错误。I don’我用python 3.6thanks运行它,这是一个问题……对不起,我在python和网络方面是全新的:再次感谢代码是为python 2编写的,但我放在那里的str是因为有一些例外types@vm381好啊那这就是你的问题;我将编辑答案。