Python telnetlib для подключения к Scrapy Telnet для чтения статистики

У меня паук Scrapy работает несколько дней. Обычно я пытаюсь проверить статистику, сколько элементов он собрал и так далее. Я просто запускаю следующие команды в терминале, и это дает мне статистику.

$ telnet [IP] [PORT]
>>> spider.name
alf-spider
>>> stats.get_stats()
...

Теперь я хочу сделать это с помощью Python, используя telnetlib, но я не могу добиться вышеуказанных результатов. Ниже приведен мой код Python.

#!/usr/bin/env python

import sys
import getpass
import telnetlib

HOST = "192.168.1.5"

def main():
    ports = ['6023']
    if len(sys.argv) > 1:
        ports = sys.argv[1].split(',')

    for port in ports:
        get_stats(port)

def get_stats(port):
    tn = telnetlib.Telnet(HOST, port)
    tn.write("spider.name\n")
    print tn.read_all()

if __name__ == '__main__':
    main()

Приведенный выше код, если он запущен, просто зависает до принудительного закрытия. Что мне не хватает?


person Eden Moore    schedule 31.08.2013    source источник
comment
Вы пробовали отлаживать этот код? Добавляете распечатки, чтобы понять, где висит этот код?   -  person Ofir Israel    schedule 31.08.2013
comment
Да. tn.read_all() никогда не возвращается.   -  person Eden Moore    schedule 31.08.2013
comment
хорошо, так может быть, это дает нам подсказку? Telnet.read_all() Read all data until EOF; block until connection closed.   -  person Ofir Israel    schedule 31.08.2013
comment
Да, кажется, сервер не отправляет никакого ответа. Вот почему он застопорился.   -  person Eden Moore    schedule 31.08.2013
comment
ну попробуй отправить "spider.name\r\n"   -  person Ofir Israel    schedule 31.08.2013
comment
Это уже пробовал. Ничего не изменилось   -  person Eden Moore    schedule 31.08.2013
comment
Есть ли способ написать через несколько секунд после установления соединения?   -  person Eden Moore    schedule 31.08.2013
comment
У вас установлено wireshark? Вы можете понюхать и посмотреть, в чем разница между способом python и способом cmd?   -  person Ofir Israel    schedule 31.08.2013
comment
Вы можете сначала прочитать, дождитесь строки ›››   -  person Ofir Israel    schedule 31.08.2013
comment
Я уже пробовал read_until(›››)   -  person Eden Moore    schedule 31.08.2013
comment
read_until(›››) работает по факту возврата.   -  person Eden Moore    schedule 31.08.2013
comment
Я просто подумал, что write(quit()\n) возвращает read_all(), но с пустым ответом.   -  person Eden Moore    schedule 31.08.2013
comment
Я нашел решение! read_until сработало, если немного изменить.   -  person Eden Moore    schedule 31.08.2013
comment
@OfirIsrael посмотри мой ответ   -  person Eden Moore    schedule 31.08.2013
comment
Удачи :) рад, что смог помочь   -  person Ofir Israel    schedule 31.08.2013


Ответы (1)


Это сработает.

#!/usr/bin/env python

import sys
import getpass
import telnetlib

HOST = "192.168.1.5"

def main():
    ports = ['6023']
    if len(sys.argv) > 1:
        ports = sys.argv[1].split(',')

    for port in ports:
        get_stats(port)

def get_stats(port):
    tn = telnetlib.Telnet(HOST, port)
    tn.read_until('>>>')
    tn.write("spider.name\n")
    print tn.read_until('>>>')
    tn.close()

if __name__ == '__main__':
    main()
person Eden Moore    schedule 31.08.2013