Прервать выполнение модуля в Python - PullRequest
8 голосов
/ 04 июля 2011

Я бы хотел остановить оценку импортируемого модуля, не останавливая всю программу.

Вот пример того, чего я хочу достичь:

main.py

print('main1')
import testmodule
print('main2')

testmodule.py

print(' module1')
some_condition=True
if some_condition:
  exit_from_module()  # How to do this?
print(' module2')     # This line is not executed.

Ожидаемый результат:

main1
 module1
main2

Ответы [ 3 ]

7 голосов
/ 04 июля 2011

Нет хорошего способа остановить выполнение модуля. Вы можете вызвать исключение, но тогда ваш модуль импорта должен будет с ним справиться. Возможно просто рефакторинг вот так:

print(' module1')
some_condition = True
if not some_condition:
  print(' module2')

Обновление. Еще лучше изменить модуль так, чтобы он определял только функции и классы, а затем вызывал одного из них для выполнения необходимой работы.

Если вы действительно хотите выполнить всю эту работу во время импорта (помните, я думаю, что было бы лучше этого не делать), вы можете изменить свой модуль так:

def _my_whole_freaking_module():
    print(' module1')
    some_condition = True
    if some_condition:
        return
    print(' module2')

_my_whole_freaking_module()
4 голосов
/ 04 июля 2011

Мой main.py выглядит следующим образом,

print 'main 1'

try:
    import my_module
except ImportError:
    pass

print 'main 2'

, а my_module.py выглядит следующим образом,

print 'module 1'

if True:
    raise ImportError
else:
    pass

print 'module 2'

вывод:

main 1
module 1
main 2
2 голосов
/ 04 июля 2011

Вы можете заключить код модуля в функцию, например:

def main():
  print(' module1')
  some_condition=True
  if some_condition:
    return
  print(' module2')

main()
...