Найти - Пользователи
Полная версия: if __name__ == "__main__" :
Начало » Python для новичков » if __name__ == "__main__" :
1 2
iBiZoNiX
Очень часто начал видеть такую конструкцию в python коде.
if  __name__ ==  "__main__" :    main()
Обьясните зачем она нужна, а лучше дайте ссылки где об этом можно прочитать :)
regall
Если вы запускаете вашу программу скриптом, то есть:
$ python my_script.py
и в этом скрипте есть вышеприведенный код, то он выполнится, так как переменной __name__ будет присвоено значение ‘__main__’. То есть, если вы запустите другой скрипт, а этот (my_script) проимпортируете, участок кода внутри условной конструкции не выполнится.
iBiZoNiX
Для Windows актуально?Запускаю не из консоли.
Alala
regall
Не очень поняла…
вот если мы импортируем какой-то модуль, ты мы используем его куски/объекты из него, но не запускаем весь модуль
или я что-то не так понимаю с импортированием?
Enchantner
Alala
код, который находится в общей области видимости, при импортировании исполняется. В случае с пакетом - исполняется код, который находится в __init__.py в папке пакета.
Scondo
Alala
regall
Не очень поняла…
вот если мы импортируем какой-то модуль, ты мы используем его куски/объекты из него, но не запускаем весь модуль
или я что-то не так понимаю с импортированием?
Вообще говоря мы его весь и исполняем. Потому что именно исполнение инструкций def, class и т.д. создает их как объекты типа “функция”, “класс” соответственно.
Когда мы используем их из этого модуля мы ссылаемся уже на объекты, созданные этими конструкциями.
Соответственно для того, чтобы отделить код, исполняемый при запуске модуля в качестве основного, используется конструкция
if  __name__ ==  "__main__" :    main()
*Возможно это не совсем корректное понимание внутренних процессов, но мне кажется оно достаточно точное для представления того, что происходит.
rocket
  #!/usr/bin/python
import sys
try:
import cgitb
cgitb.enable()
except ImportError:
sys.stderr = sys.stdout

def cgiprint(inline=''):
sys.stdout.write(inline)
sys.stdout.write('\r\n')
sys.stdout.flush()

contentheader = 'Content-Type: text/html'

thepage = '''<html><head>
<title>%s</title>
</head><body>
%s
</body></html>
'''
h1 = '<h1>%s</h1>'

if __name__ == '__main__':
cgiprint(contentheader) # заголовок вывода
cgiprint() # обязательная пустая строка для отделения заголовка от выводимых данных

title = 'Hello World'
headline = h1 % 'Hello, world!'

print thepage % (title, headline) # вывод кода html .
Объясните пожалуйста на этом примере.
Soteric
При импорте код выделенный красным выполнен не будет. При выполнении этого скрипта через “python скрипт.py” он будет выполнен весь.
#!/usr/bin/python
import sys
try:
import cgitb
cgitb.enable()
except ImportError:
sys.stderr = sys.stdout

def cgiprint(inline=''):
sys.stdout.write(inline)
sys.stdout.write('\r\n')
sys.stdout.flush()


contentheader = ‘Content-Type: text/html’

thepage = ‘'’<html><head>
<title>%s</title>
</head><body>
%s
</body></html>
'''
h1 = ‘<h1>%s</h1>’

if __name__ == ‘__main__’:
cgiprint(contentheader) # заголовок вывода
cgiprint() # обязательная пустая строка для отделения заголовка от выводимых данных

title = ‘Hello World’
headline = h1 % ‘Hello, world!’

print thepage % (title, headline) # вывод кода html .
mr-x
Попробую другими словами объяснить, как я сам на днях это понял.

При импорте кода из данного модуля значение __name__ будет иметь имя того модуля, в который импортируется содержимое этого. Значит код под условием выполняться не будет. Если запустить на выполнение сам этот файл, то условие if __name__ == ‘__main__’: выполнится.

Как пример, вот написал я програмульку, которая перебирая последовательные порты ищет на одном из них присутствия некоего устройства. Обращаясь к этому модулю из другой программы мне от него нужно только порт или None, больше ничего. А под сабжевое условие запихнул вывод отладочной информации и, запустив на выполнение непосредственно этот модуль, можно увидеть в подробностях как оно работает со всеми подробностями. Что полезно для отладки.
rocket
Я так понял что программа которая импортирует - примет переменные , данные всякие . Но не будет выполнять функции из импортируемого модуля , не будет выполнять действий?Коряво конечно изъясняюсь .
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB