2017-02-15 4 views
2

Я хочу, чтобы модуль Python, который я писал, импортировал модуль зависимостей, только если функция в моем модуле запущена. Это связано с тем, что модуль зависимостей очень сложный (т. Е. Устанавливает серверные программы и т. Д.) И доступен только в некоторых системах, на которых мой модуль должен использоваться. Я представляю себе, используя свой модуль таким образом, как это:Как модуль может быть импортирован в модуль Python только после запуска функции в модуле?

import mymodule 
mymodule.simple_function() # just a simple function to be used on any system 

mymodule.import_complex_dependencies() 
mymodule.function_that_uses_functionality_of_the_complex_dependency_module() 

Если предположить, что я не собираюсь разделить мой модуль на два, и я не собираюсь делать подмодуль, что будет какой-то способ сделать это?

+0

Почему бы вам не принять один из ответов? –

+0

@Mr_and_Mrs_D Я благодарен за предлагаемые решения, и эти решения полезны для некоторых людей, но они не являются, насколько я вижу, решением для меня. Мне нужно избегать многократного импорта сложного модуля. – BlandCorporation

+0

Если модуль импортируется один раз, он никогда не реимпортируется - что вы не понимаете? Поместите распечатку в свой модуль, следуйте решению @ user2357112 и увидите распечатку только один раз, независимо от количества вызовов методов. –

ответ

4

Если только некоторые конкретной функции необходимо этот модуль, только что конкретная функция импорта модуля:

def func_with_dependencies(): 
    import dependency 
    ... 
+0

OP говорит, что для всех модулей требуются некоторые функции. – VMAtm

+0

@VMAtm: О чём вы говорите? – user2357112

+0

OP сказал, что ему нужны некоторые простые функции из 'mymodule' для всех систем и некоторые сложные для выбранных. Просто пытаясь прояснить ваше решение, почему это так? – VMAtm

0

Вы можете сделать что-то вроде этого:

complex_stuff = None 

def load_complex_stuff(): 
    global complex_stuff 
    if complex_stuff is None: 
     import complex_stuff 


def func_using_it(): 
    load_complex_stuff() 
    ... more ... 


def func_using_it_2(): 
    load_complex_stuff() 
    ... more ... 

Этот путь сложный материал только получает загружен один раз.

+1

Если мне не хватает чего-то, для этой логики нет необходимости ('load_complex_stuff()'), поскольку импорт является noop, если модуль уже импортирован. –

+0

@Claudiu Спасибо за ваше предложение. Мне нужно несколько раз импортировать этот сложный модуль. – BlandCorporation