Импорт модуля python без его фактического выполнения

В контексте сложного приложения мне нужно импортировать пользовательские "скрипты". В идеале, скрипт должен иметь

def init():
    blah

def execute():
    more blah

def cleanup():
    yadda

поэтому я просто

import imp
fname, path, desc = imp.find_module(userscript)
foo = imp.load_module(userscript, fname, path, desc)
foo.init()

Однако, как мы все знаем, пользовательский скрипт выполняется, как только выполняется load_module. Это значит, что скрипт может быть примерно таким:

def init():
    blah

yadda

уступая части yadda, которая будет вызвана, как только я импортирую скрипт.

Что мне нужно, так это способ:

  1. сначала проверить, есть ли у него init(), execute() и cleanup()
  2. если они есть, все в порядке
  3. если их нет, пожаловаться
  4. не запускать никакой другой код, или, по крайней мере, пока я не узнаю, что нет init()

Обычно я бы заставил использовать тот же старый трюк if __name__ == '__main__', но у меня мало контроля над пользовательским скриптом, поэтому я ищу относительно безболезненное решение. Я видел всевозможные сложные трюки, включая разбор скрипта, но ничего действительно простого. Я удивлен, что этого не существует... или, может быть, я чего-то не понимаю.

Спасибо.

18
задан lorenzog 18 December 2011 в 13:53
поделиться