Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 30, 2011 13:58:28

iBiZoNiX
От: Пирятин
Зарегистрирован: 2011-07-05
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Очень часто начал видеть такую конструкцию в python коде.

if  __name__ ==  "__main__" :    main()
Обьясните зачем она нужна, а лучше дайте ссылки где об этом можно прочитать :)



Офлайн

#2 Авг. 30, 2011 14:57:52

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Если вы запускаете вашу программу скриптом, то есть:

$ python my_script.py
и в этом скрипте есть вышеприведенный код, то он выполнится, так как переменной __name__ будет присвоено значение ‘__main__’. То есть, если вы запустите другой скрипт, а этот (my_script) проимпортируете, участок кода внутри условной конструкции не выполнится.



Офлайн

#3 Авг. 31, 2011 07:19:02

iBiZoNiX
От: Пирятин
Зарегистрирован: 2011-07-05
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Для Windows актуально?Запускаю не из консоли.



Офлайн

#4 Авг. 31, 2011 09:17:50

Alala
От:
Зарегистрирован: 2011-07-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

regall
Не очень поняла…
вот если мы импортируем какой-то модуль, ты мы используем его куски/объекты из него, но не запускаем весь модуль
или я что-то не так понимаю с импортированием?



Офлайн

#5 Авг. 31, 2011 09:23:23

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Alala
код, который находится в общей области видимости, при импортировании исполняется. В случае с пакетом - исполняется код, который находится в __init__.py в папке пакета.



Офлайн

#6 Авг. 31, 2011 15:51:31

Scondo
От:
Зарегистрирован: 2011-08-30
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Alala
regall
Не очень поняла…
вот если мы импортируем какой-то модуль, ты мы используем его куски/объекты из него, но не запускаем весь модуль
или я что-то не так понимаю с импортированием?
Вообще говоря мы его весь и исполняем. Потому что именно исполнение инструкций def, class и т.д. создает их как объекты типа “функция”, “класс” соответственно.
Когда мы используем их из этого модуля мы ссылаемся уже на объекты, созданные этими конструкциями.
Соответственно для того, чтобы отделить код, исполняемый при запуске модуля в качестве основного, используется конструкция
if  __name__ ==  "__main__" :    main()
*Возможно это не совсем корректное понимание внутренних процессов, но мне кажется оно достаточно точное для представления того, что происходит.



Отредактировано (Авг. 31, 2011 15:54:53)

Офлайн

#7 Март 21, 2012 22:44:07

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

  #!/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 .
Объясните пожалуйста на этом примере.



Офлайн

#8 Март 22, 2012 03:41:43

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

При импорте код выделенный красным выполнен не будет. При выполнении этого скрипта через “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 .



Офлайн

#9 Март 22, 2012 10:43:11

mr-x
От:
Зарегистрирован: 2012-03-15
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Попробую другими словами объяснить, как я сам на днях это понял.

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

Как пример, вот написал я програмульку, которая перебирая последовательные порты ищет на одном из них присутствия некоего устройства. Обращаясь к этому модулю из другой программы мне от него нужно только порт или None, больше ничего. А под сабжевое условие запихнул вывод отладочной информации и, запустив на выполнение непосредственно этот модуль, можно увидеть в подробностях как оно работает со всеми подробностями. Что полезно для отладки.



Офлайн

#10 Март 22, 2012 21:04:03

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

if __name__ == "__main__" :

Я так понял что программа которая импортирует - примет переменные , данные всякие . Но не будет выполнять функции из импортируемого модуля , не будет выполнять действий?Коряво конечно изъясняюсь .



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version