Могу ли я вызывать функции или изменять переменные через 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__.