2016-05-06 9 views
1

Итак, у меня есть приложение Python, у которого есть эта функция, где любой модуль-подобный файл в подкаталоге extensions каталога программ импортируется на ранней стадии процесса инициализации приложения.Monkey patch модуль, который импортирует этот

Это выглядит примерно так (предположим это my_application.py):

def do_init(): 
    for thefname in glob.iglob(os.path.join(".","extensions","*")): 
     SourceFileLoader(os.path.basename(thefname),thefname).load_module() 
    #do other init stuff... 

if __name__ == "__main__": 
    do_init() 
    do_cool_things() 

Теперь, я хотел бы быть в состоянии иметь .py файл в этом каталоге расширений, что идет что-то вроде этого:

import my_application 
def my_cool_things(): 
    print("The original things have been overridden.") 
my_application.do_cool_things = my_cool_things 

И это работает ... для будущих импортных товаров my_application. Но вызов do_cool_things внутри охранника if __name__ == "__main__" показывает оригинальное поведение. Почему это происходит, и как я могу заставить этот вызов проявить измененное поведение?

ответ

1

Модуль, созданный при запуске сценария под названием my_application.py, на удивление не является my_application. Модуль, созданный при запуске скрипта, - __main__. Конечно, модуль, созданный , импортируя, файл my_application.py будет называться my_application.

Два решения вашей проблемы - заменить import my_application либо import __main__, либо import builtins.

Простая демонстрация:

#x.py 
import y 
print ("Hello", hello) 

и

#y.py 
import __main__ 
__main__.hello = 'world' 

Тест на Ubuntu 14.04 с Python 3.4.3:

$ python3 x.py 
Hello world 
$ 
+0

Это работает! И здесь я пытаюсь получить функции модуля, разворачивая стек через импортную машину ...: P – Schilcote

 Смежные вопросы

  • Нет связанных вопросов^_^