Могу ли я вызывать функции или изменять переменные через eventlet.backdoor в Python?

Я написал этот минимальный код, чтобы объяснить мой случай:

import threading
import time
import eventlet
from eventlet import backdoor

eventlet.monkey_patch()

global should_printing
should_printing = True

def turn_off_printing():
    global should_printing
    should_printing = not should_printing

def printing_function():
    global should_printing
    while should_printing == True:
        print "printing"
        time.sleep(1)

def console():
    while True:
        print "inside console"
        time.sleep(1)

if __name__ == '__main__':
    eventlet.spawn(backdoor.backdoor_server, eventlet.listen(('localhost', 3000)))

    thread = threading.Thread(target=printing_function)
    thread.start()

    thread = threading.Thread(target=console)
    thread.start()

После его выполнения я подключаюсь через telnet, импортирую свой модуль и вызываю turn_off_printing(). Но это не работает. Я сделал ошибку, или это невозможно?

3 ответа

Решение

Как сказал Fthinker в комментарии выше:

Не похоже, что бэкдор-сервер использует то же пространство имен. Ввод имен функций говорит, что они не определены, а ваша переменная 'should_printing' также не определена. Я проверил это, в то время как telnetted в интерпретатор, настроенный внутренним сервером.

(если fthinker ответит как пост, я удалю этот пост)

Убедитесь, что вы передаете все переменные / функции, которые вам нравятся, при вызове backdoor

if __name__ == '__main__':
    s=eventlet.spawn(backdoor.backdoor_server, eventlet.listen(('localhost', 3000)), globals())

    thread1 = threading.Thread(target=printing_function)
    thread1.start()

    s.wait()

Теперь must_printing должен быть виден на интерпретаторе python, работающем на порту 3000, и установка его в значение false остановит печать

Вы не можете получить доступ should_printing поскольку __main__ Модуль отличается от импортируемого модуля, даже если это один и тот же модуль. Проверьте детали здесь

the executing script runs in a module named __main__, importing the
script under its own name will create a new module unrelated to
__main__.
Другие вопросы по тегам