Учитывая следующий код, что делает if __name__ == "__main__":
?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
python
namespaces
main
python-module
idioms
посвященный
источник
источник
if __name__ == "__main__":
Является ли состояние блока устаревшим или устаревшим по сравнению с Python 3? Я нашел некоторую информацию, подтверждающую это.Ответы:
Всякий раз, когда интерпретатор Python читает исходный файл, он делает две вещи:
он устанавливает несколько специальных переменных, таких как
__name__
, а затемон выполняет весь код, найденный в файле.
Давайте посмотрим, как это работает и как это связано с вашим вопросом о
__name__
проверках, которые мы всегда видим в скриптах Python.Пример кода
Давайте использовать немного другой пример кода, чтобы изучить, как работают импорт и скрипты. Предположим, что следующее находится в файле с именем
foo.py
.Специальные переменные
Когда интерпретатор Python читает исходный файл, он сначала определяет несколько специальных переменных. В этом случае мы заботимся о
__name__
переменной.Когда ваш модуль является основной программой
Если вы используете свой модуль (исходный файл) в качестве основной программы, например,
интерпретатор назначит жестко строку
"__main__"
в__name__
переменной, т.е.Когда ваш модуль импортируется другим
С другой стороны, предположим, что какой-то другой модуль является основной программой и импортирует ваш модуль. Это означает, что в основной программе или в каком-либо другом модуле основной программы есть такой оператор:
Интерпретатор будет искать ваш
foo.py
файл (наряду с поиском нескольких других вариантов), и перед выполнением этого модуля он присвоит имя"foo"
из оператора import__name__
переменной, т.е.Выполнение кода модуля
После того, как специальные переменные установлены, интерпретатор выполняет весь код в модуле, по одному выражению за раз. Вы можете открыть другое окно сбоку с примером кода, чтобы вы могли следовать этому объяснению.
Всегда
Он печатает строку
"before import"
(без кавычек).Он загружает
math
модуль и присваивает его переменной с именемmath
. Это эквивалентно заменеimport math
следующего (обратите внимание, что__import__
это функция низкого уровня в Python, которая принимает строку и запускает фактический импорт):Он печатает строку
"before functionA"
.Он выполняет
def
блок, создавая функциональный объект, а затем присваивая этот функциональный объект переменной с именемfunctionA
.Он печатает строку
"before functionB"
.Он выполняет второй
def
блок, создавая другой функциональный объект, затем присваивая его переменной с именемfunctionB
.Он печатает строку
"before __name__ guard"
.Только когда ваш модуль является основной программой
__name__
действительно установлено,"__main__"
и вызовет две функции, печатая строки"Function A"
и"Function B 10.0"
.Только когда ваш модуль импортируется другим
__name__
будет"foo"
,"__main__"
а не пропустит телоif
оператора.Всегда
"after __name__ guard"
в обеих ситуациях.Резюме
В итоге вот что будет напечатано в двух случаях:
Почему это работает так?
Естественно, вы можете удивиться, почему кто-то захочет этого. Ну, иногда вы хотите написать
.py
файл, который может быть использован другими программами и / или модулями как модуль, а также может быть запущен как основная программа. Примеры:Ваш модуль - это библиотека, но вы хотите иметь режим сценария, в котором он запускает некоторые модульные тесты или демонстрацию.
Ваш модуль используется только в качестве основной программы, но у него есть несколько модульных тестов, и среда тестирования работает путем импорта
.py
файлов, таких как ваш скрипт, и запуска специальных функций тестирования. Вы не хотите, чтобы он пытался запустить скрипт только потому, что он импортирует модуль.Ваш модуль в основном используется в качестве основной программы, но он также предоставляет удобный для программиста API для опытных пользователей.
Помимо этих примеров, элегантно, что запуск скрипта в Python - это просто установка нескольких магических переменных и импорт скрипта. «Запуск» скрипта является побочным эффектом импорта модуля скрипта.
Пища для размышлений
Вопрос: Могу ли я иметь несколько
__name__
блоков проверки? Ответ: это странно, но язык не остановит вас.Предположим, что следующее в
foo2.py
. Что произойдет, если вы скажетеpython foo2.py
в командной строке? Почему?__name__
регистрациюfoo3.py
:источник
subprocess.run('foo_bar.py')
скрипт на python? Я полагаю, чтоfoo_bar
это будет начинаться так__name__ = '__main__'
же, как приfoo_bar.py
ручном вводе cmd. Это тот случай? Принимая во внимание @MrFooz 'Answer, не должно быть никаких проблем с этим и наличием столько «основных» модулей одновременно, сколько мне нравится. Даже изменение__name__
значения или наличие нескольких независимых созданий экземпляров (или экземпляров, которые создали друг другаsubprocess
), взаимодействующих друг с другом, должно быть обычным делом для Python. Я что-то пропустил?subprocess.run
. Тем не менее, как правило, лучший способ совместного использования кода между сценариями - это создание модулей, в которых сценарии вызывают общие модули вместо вызова друг друга в качестве сценариев. Трудно отлаживатьsubprocess.run
вызовы, так как большинство отладчиков не пересекают границы процессов, они могут добавить нетривиальные издержки системы для создания и уничтожения дополнительных процессов и т. Д.from foo2 import functionB
импортировать foo2 из функции B ? Это семантическое искажение.from module import method
импортирует метод из модуля.multiprocessing
, в частности, делает этот тест необходимым в Windows.Когда ваш скрипт запускается путем передачи его в качестве команды интерпретатору Python,
весь код на уровне отступа 0 выполняется. Определенные функции и классы, ну, в общем, определены, но ни один из их кода не запускается. В отличие от других языков, нет
main()
функции, которая запускается автоматически -main()
функция неявно представляет собой весь код верхнего уровня.В этом случае код верхнего уровня является
if
блоком.__name__
является встроенной переменной, которая оценивает имя текущего модуля. Однако, если модуль запускается напрямую (какmyscript.py
описано выше),__name__
вместо этого устанавливается строка"__main__"
. Таким образом, вы можете проверить, выполняется ли ваш скрипт напрямую или импортируется чем-то другим, проверяяЕсли ваш скрипт импортируется в другой модуль, его различные определения функций и классов будут импортированы, а его код верхнего уровня будет выполнен, но код в теле then
if
вышеприведенного предложения не будет запущен, поскольку условие не встречал В качестве основного примера рассмотрим следующие два сценария:Теперь, если вы вызываете переводчик как
Выход будет
Если вы запустите
two.py
вместо:Ты получаешь
Таким образом, когда модуль
one
загружается, он__name__
равен"one"
вместо"__main__"
.источник
Простейшее объяснение
__name__
переменной (imho) следующее:Создайте следующие файлы.
а также
Запустив их, вы получите такой вывод:
Как вы можете видеть, когда модуль импортируется, Python устанавливает
globals()['__name__']
в этом модуле имя модуля. Также при импорте запускается весь код в модуле. Посколькуif
утверждение оценивается,False
эта часть не выполняется.Как вы можете видеть, когда файл выполняется, Python устанавливает
globals()['__name__']
в этом файле значение"__main__"
. На этот разif
оператор оцениваетTrue
и выполняется.источник
Чтобы изложить основы:
Глобальная переменная
__name__
в модуле, являющемся точкой входа в вашу программу, имеет вид'__main__'
. В противном случае это имя, по которому вы импортируете модуль.Таким образом, код под
if
блоком будет работать, только если модуль является точкой входа в вашу программу.Это позволяет импортировать код в модуле другими модулями, не выполняя блок кода ниже при импорте.
Почему нам это надо?
Разработка и тестирование вашего кода
Допустим, вы пишете скрипт Python, предназначенный для использования в качестве модуля:
Вы можете протестировать модуль, добавив этот вызов функции внизу:
и запустить его (в командной строке) с чем-то вроде:
Проблема
Однако, если вы хотите импортировать модуль в другой скрипт:
При импорте
do_important
вызывается функция, поэтому вы, вероятно, закомментируете свой вызов функцииdo_important()
внизу.И тогда вам нужно будет вспомнить, закомментировали ли вы свой вызов тестовой функции или нет. И эта дополнительная сложность будет означать, что вы, вероятно, забудете, что сделает ваш процесс разработки более хлопотным.
Лучший путь
В
__name__
точки переменных в пространстве имен , где интерпретатор Python , случается в данный момент.Внутри импортированного модуля это имя этого модуля.
Но внутри основного модуля (или интерактивного сеанса Python, то есть Read, Eval, Print Loop или REPL интерпретатора) вы запускаете все из его
"__main__"
.Так что если вы проверите перед выполнением:
С учетом вышеизложенного ваш код будет выполняться только тогда, когда вы запускаете его в качестве основного модуля (или намеренно вызываете его из другого скрипта).
Еще лучший путь
Тем не менее, есть Pythonic способ улучшить это.
Что если мы хотим запустить этот бизнес-процесс снаружи модуля?
Если мы поместим код, который мы хотим использовать при разработке и тестировании в подобную функцию, а затем сделаем нашу проверку
'__main__'
сразу после:Теперь у нас есть заключительная функция для конца нашего модуля, которая будет работать, если мы запустим модуль как основной модуль.
Это позволит импортировать модуль и его функции и классы в другие сценарии без запуска
main
функции, а также позволит вызывать модуль (и его функции и классы) при запуске из другого'__main__'
модуля, т.е.Эту идиому также можно найти в документации по Python в объяснении
__main__
модуля. Этот текст гласит:источник
if __name__ == "__main__"
это та часть, которая запускается, когда скрипт запускается из (скажем) командной строки с помощью такой команды, какpython myscript.py
.источник
helloworld.py
с только чтоprint("hello world")
в нем может работать с командой,python helloworld.py
даже если нетif __name__ == "__main__"
?__name__
является глобальной переменной (в Python, глобальная на самом деле означает на уровне модуля ), которая существует во всех пространствах имен. Обычно это имя модуля (какstr
тип).Однако в качестве единственного особого случая в любом процессе Python, который вы запускаете, как в mycode.py:
в противном случае анонимному глобальному пространству имен присваивается значение
'__main__'
его__name__
.Таким образом, включая последние строки
приведет
main
к запуску уникально определенной функции вашего скрипта .Еще одно преимущество использования этой конструкции: вы также можете импортировать свой код в виде модуля в другой скрипт, а затем запустить основную функцию, если и когда ваша программа решит:
источник
Здесь много разных подходов к механике рассматриваемого кода, «как», но для меня ничего из этого не имело смысла, пока я не понял «почему». Это должно быть особенно полезно для новых программистов.
Возьмите файл "ab.py":
И второй файл "xy.py":
Когда вы выполняете
xy.py
, выimport ab
. Оператор import сразу же запускает модуль при импорте, поэтомуab
операции выполняются раньше, чем до концаxy
. После того, как закончилab
, это продолжается сxy
.Интерпретатор отслеживает, с какими сценариями выполняется
__name__
. Когда вы запускаете скрипт - независимо от того, как вы его назвали - интерпретатор вызывает его"__main__"
, делая его основным или «домашним» скриптом, который возвращается после запуска внешнего скрипта.Любому другому сценарию, вызываемому из этого
"__main__"
сценария, присваивается имя файла в качестве его__name__
(например,__name__ == "ab.py"
). Следовательно, строкаif __name__ == "__main__":
является тестом интерпретатора, чтобы определить, интерпретирует ли он / анализирует «домашний» сценарий, который был первоначально выполнен, или он временно просматривает другой (внешний) сценарий. Это дает программисту гибкость, позволяющую сценарию вести себя по-разному, если он выполняется напрямую или вызывается извне.Давайте пройдемся по приведенному выше коду, чтобы понять, что происходит, сосредоточив внимание в первую очередь на неиспользуемых строках и порядке их появления в скриптах. Помните, что
def
блоки функций и / или сами ничего не делают, пока их не вызовут. Что может сказать переводчик, если бормочет себе:"__main__"
в__name__
переменной.__name__ == "ab.py"
.a()
; Я только что узнал это. Печать « Функция в файле ab »."__main__"
!x()
; хорошо, печатать « периферийное задание: может быть полезно в других проектах ».if
Заявление. Итак, условие выполнено (переменная__name__
установлена в"__main__"
), поэтому я войду вmain()
функцию и выведу « main function: это где действие ».Две нижние строки означают: «Если это
"__main__"
скрипт« home », выполните вызываемую функциюmain()
». Вот почему вы увидитеdef main():
блок вверху, который содержит основной поток функциональности скрипта.Помните, что я говорил ранее об операциях импорта? Когда вы импортируете модуль, он не просто «распознает» его и ждет дальнейших инструкций - он фактически выполняет все исполняемые операции, содержащиеся в скрипте. Таким образом, помещение мяса вашего скрипта в
main()
функцию эффективно помещает его в карантин, изолируя его, чтобы он не запускался сразу после импорта другим скриптом.Опять же, будут исключения, но обычная практика заключается в том,
main()
что обычно не вызывается извне. Так что вам может быть интересно еще одно: если мы не звонимmain()
, почему мы вообще вызываем скрипт? Это связано с тем, что многие люди структурируют свои сценарии с помощью автономных функций, которые создаются для запуска независимо от остальной части кода в файле. Затем они позже вызваны где-то еще в теле сценария. Что подводит меня к этому:Да все верно. Эти отдельные функции могут быть вызваны из встроенного скрипта, который не содержится внутри
main()
функции. Если вы привыкли (как и я, на ранних этапах обучения программированию) к созданию встроенных сценариев, которые выполняют именно то, что вам нужно, и вы попытаетесь снова это выяснить, если вам когда-нибудь понадобится эта операция снова ... Ну, вы не привыкли к такого рода внутренней структуре своего кода, потому что его сложнее построить и он не настолько интуитивно понятен для чтения.Но это сценарий, который, вероятно, не может вызывать свои функции извне, потому что если он это сделает, он немедленно начнет вычислять и присваивать переменные. И есть вероятность, что если вы пытаетесь повторно использовать функцию, ваш новый скрипт достаточно тесно связан со старым, что будут конфликтующие переменные.
Разбивая независимые функции, вы получаете возможность повторно использовать вашу предыдущую работу, вызывая их в другой скрипт. Например, «example.py» может импортировать «xy.py» и вызывать
x()
, используя функцию «x» из «xy.py». (Возможно, это заглавная буква третьего слова данной текстовой строки; создание массива NumPy из списка чисел и возведение их в квадрат; или растяжение трехмерной поверхности. Возможности безграничны.)(Помимо этого , этот вопрос содержит ответ @kindall, который наконец помог мне понять - почему, а не как. К сожалению, он был помечен как дубликат этого , что я считаю ошибкой.)
источник
Когда в нашем модуле (
M.py
) есть определенные операторы, которые мы хотим выполнить, когда он будет работать как основной (не импортированный), мы можем поместить эти операторы (тестовые случаи, операторы печати) в этотif
блок.По умолчанию (когда модуль работает как основной, а не импортированный),
__name__
переменная устанавливается на"__main__"
, и когда она будет импортирована,__name__
переменная получит другое значение, скорее всего, имя модуля ('M'
). Это полезно для одновременного запуска различных вариантов модулей и разделения их конкретных операторов ввода и вывода, а также при наличии тестов.Короче говоря , используйте этот
if __name__ == "main"
блок ' ', чтобы предотвратить запуск (определенного) кода при импорте модуля.источник
Проще говоря,
__name__
это переменная, определенная для каждого сценария, которая определяет, выполняется ли сценарий как основной модуль или как импортированный модуль.Так что, если у нас есть два сценария;
а также
Результат выполнения script1:
И результат выполнения script2:
Как видите,
__name__
говорит нам, какой код является «основным» модулем. Это здорово, потому что вы можете просто написать код и не беспокоиться о структурных проблемах, как в C / C ++, где, если файл не реализует функцию main, он не может быть скомпилирован как исполняемый файл, и если он это делает, затем его нельзя использовать в качестве библиотеки.Скажем, вы пишете скрипт на Python, который делает что-то великое, и вы реализуете множество функций, которые полезны для других целей. Если я хочу использовать их, я могу просто импортировать ваш сценарий и использовать их, не выполняя вашу программу (учитывая, что ваш код выполняется только в
if __name__ == "__main__":
контексте). Принимая во внимание, что в C / C ++ вам придется разделить эти части на отдельный модуль, который затем включает файл. Изобразите ситуацию ниже;Стрелки являются ссылками на импорт. Для трех модулей, каждый из которых пытается включить код предыдущих модулей, имеется шесть файлов (девять, считая файлы реализации) и пять ссылок. Это затрудняет включение другого кода в проект C, если он не скомпилирован специально как библиотека. Теперь представьте это для Python:
Вы пишете модуль, и если кто-то хочет использовать ваш код, он просто импортирует его, и
__name__
переменная может помочь отделить исполняемую часть программы от части библиотеки.источник
Давайте посмотрим на ответ более абстрактно:
Предположим, у нас есть этот код в
x.py
:Блоки A и B запускаются, когда мы бежим
x.py
.Но просто блок A (а не B) запускается, когда мы запускаем другой модуль,
y.py
например, в которыйx.py
импортируется и оттуда выполняется код (например, когдаx.py
вызывается функция iny.py
).источник
Когда вы запускаете Python в интерактивном режиме, локальной
__name__
переменной присваивается значение__main__
. Аналогично, когда вы запускаете модуль Python из командной строки, а не импортируете его в другой модуль, его__name__
атрибуту присваивается значение__main__
, а не фактическое имя модуля. Таким образом, модули могут смотреть на свои собственные__name__
значения, чтобы определить для себя, как они используются, в качестве поддержки другой программы или в качестве основного приложения, выполняемого из командной строки. Таким образом, следующая идиома довольно распространена в модулях Python:источник
Рассматривать:
Он проверяет, является ли
__name__
атрибут скрипта Python"__main__"
. Другими словами, если сама программа выполняется, атрибут будет__main__
, поэтому программа будет выполнена (в данном случаеmain()
функция).Однако, если ваш скрипт Python используется модулем,
if
будет выполнен любой код вне оператора, поэтомуif \__name__ == "\__main__"
он используется только для проверки, используется ли программа в качестве модуля или нет, и поэтому решает, запускать ли код.источник
Прежде чем что-то объяснять,
if __name__ == '__main__'
важно понять, что__name__
и для чего нужно.__name__
является DunderAlias - можно рассматривать как глобальную переменную (доступную из модулей) и работает аналогичным образом , кglobal
.Это строка (глобальная, как упомянуто выше), обозначенная как
type(__name__)
(выходная<class 'str'>
), и это встроенный стандарт для версий как Python 3, так и Python 2 .Его можно использовать не только в скриптах, но также в интерпретаторе и модулях / пакетах.
Переводчик:
Автор сценария:
test_file.py :
В результате чего
__main__
Модуль или пакет:
somefile.py:
test_file.py:
В результате чего
somefile
Обратите внимание, что при использовании в пакете или модуле,
__name__
принимает имя файла. Путь к фактическому модулю или пути пакета не указан, но имеет свой собственный DunderAlias__file__
, который учитывает это.Вы должны увидеть, что, куда
__name__
, где находится главный файл (или программа), всегда будет возвращаться__main__
, и если это модуль / пакет или что-либо, выполняющееся на каком-либо другом скрипте Python, вернет имя файла, в котором он находится. возникла из.Наличие переменной означает, что ее значение может быть перезаписано («может» не означает «следует»), перезапись значения
__name__
приведет к недостаточной читаемости. Так что не делай этого ни по какой причине. Если вам нужна переменная, определите новую переменную.Всегда предполагается, что значение
__name__
должно быть__main__
или имя файла. Повторное изменение этого значения по умолчанию вызовет еще большую путаницу в том, что оно пойдет на пользу, что вызовет проблемы в дальнейшем.пример:
В целом считается хорошей практикой включать
if __name__ == '__main__'
в сценарии.Теперь мы знаем, что поведение
__name__
вещей становится понятнее:if
Является управление потоком заявление , которое содержит блок кода будет выполняться , если значение , данное верно. Мы видели, что__name__
может принимать либо__main__
имя файла, из которого он был импортирован.Это означает, что если
__name__
равно,__main__
то файл должен быть основным файлом и должен фактически выполняться (или интерпретатором), а не модулем или пакетом, импортированным в скрипт.Если действительно
__name__
принимает значение,__main__
то все, что находится в этом блоке кода, будет выполняться.Это говорит нам о том, что если выполняемый файл является основным файлом (или вы запускаете непосредственно из интерпретатора), то это условие должно выполняться. Если это пакет, то не должен, и значение не будет
__main__
.__name__
также может использоваться в модулях для определения имени модуляТакже можно делать другие, менее распространенные, но полезные вещи
__name__
, некоторые из которых я покажу здесь:Выполняется, только если файл является модулем или пакетом:
Выполнение одного условия, если файл является основным, и другого, если это не так:
Вы также можете использовать его для предоставления запускаемых функций / утилит справки для пакетов и модулей без сложного использования библиотек.
Это также позволяет запускать модули из командной строки в качестве основных сценариев, что также может быть очень полезным.
источник
Я думаю, что лучше разбить ответ подробно и простыми словами:
__name__
Каждый модуль в Python имеет специальный атрибут с именем__name__
. Это встроенная переменная, которая возвращает имя модуля.__main__
Как и в других языках программирования, Python также имеет точку входа для выполнения, то есть main.'__main__'
Имя области, в которой выполняется код верхнего уровня . По сути, у вас есть два способа использования модуля Python: запустить его непосредственно как скрипт или импортировать его. Когда модуль запускается как скрипт,__name__
он устанавливается на__main__
.Таким образом, значение
__name__
атрибута устанавливается__main__
при запуске модуля в качестве основной программы. В противном случае значение__name__
должно содержать имя модуля.источник
Это особый случай, когда файл Python вызывается из командной строки. Обычно это используется для вызова функции main () или выполнения другого подходящего кода запуска, например, для обработки аргументов командной строки.
Это может быть написано несколькими способами. Другой это:
Я не говорю, что вы должны использовать это в рабочем коде, но это служит иллюстрацией того, что в этом нет ничего «волшебного»
if __name__ == '__main__'
. Это хорошее соглашение для вызова основной функции в файлах Python.источник
and
.and
используется для проверки, являются ли два логических оператора истинными. Поскольку вас не интересует результатand
, вif
заявлении более четко сообщается о ваших намерениях.Существует ряд переменных, которые система (интерпретатор Python) предоставляет для исходных файлов (модулей). Вы можете получить их значения в любое время, поэтому давайте сосредоточимся на переменной / атрибуте __name__ :
Когда Python загружает файл исходного кода, он выполняет весь найденный в нем код. (Обратите внимание, что он не вызывает все методы и функции, определенные в файле, но он определяет их.)
Перед тем, как интерпретатор выполнит файл исходного кода, он определит несколько специальных переменных для этого файла; __name__ - это одна из тех специальных переменных, которые Python автоматически определяет для каждого файла исходного кода.
Если Python загружает этот файл исходного кода в качестве основной программы (то есть файла, который вы запускаете), то он устанавливает специальную переменную __name__ для этого файла, чтобы иметь значение «__main__» .
Если это импортируется из другого модуля, __name__ будет установлен на имя этого модуля.
Итак, в вашем примере частично:
означает, что блок кода:
будет выполняться только при непосредственном запуске модуля; блок кода не будет выполняться, если другой модуль вызывает / импортирует его, потому что значение __name__ не будет равно « main » в данном конкретном случае.
Надеюсь, это поможет.
источник
if __name__ == "__main__":
в основном это среда сценариев верхнего уровня, и она определяет интерпретатор, который («у меня самый высокий приоритет для выполнения первым»).'__main__'
Имя области, в которой выполняется код верхнего уровня. Модуль__name__
устанавливается равным'__main__'
при чтении из стандартного ввода, сценария или из интерактивного приглашения.источник
Я так много читал в ответах на этой странице. Я бы сказал, если вы знаете это, наверняка вы поймете эти ответы, иначе вы все еще в замешательстве.
Чтобы быть кратким, вам нужно знать несколько моментов:
import a
действие фактически запускает все, что может быть запущено в «а»Из-за пункта 1 вы можете не захотеть, чтобы все выполнялось в «а» при импорте
Чтобы решить проблему в пункте 2, python позволяет поставить проверку состояния
__name__
является неявной переменной во всех.py
модулях; когдаa.py
импортируется, значение__name__
изa.py
модуля устанавливается в имени файла "a
«; когдаa.py
выполняется непосредственно с помощью «python a.py
», что означает ,a.py
как точку входа, то значение__name__
изa.py
модуля устанавливается в строку__main__
Основываясь на механизме, как python устанавливает переменную
__name__
для каждого модуля, знаете ли вы, как достичь пункта 3? Ответ довольно прост, верно? Помещенный если условие:if __name__ == "__main__": ...
; Вы можете даже поставить, если в__name__ == "a"
зависимости от ваших функциональных потребностейВажной особенностью Python является точка 4! Остальное - просто базовая логика.
источник
Рассматривать:
Выход для вышеизложенного есть
__main__
.Вышеприведенное утверждение верно и печатает «прямой метод» . Предположим, что если они импортировали этот класс в другой класс, он не печатает «прямой метод», потому что при импорте он установит
__name__ equal to "first model name"
.источник
fibo.py (названный модуль
fibo
)Ссылка: https://docs.python.org/3.5/tutorial/modules.html
источник
Причина для
прежде всего, чтобы избежать проблем с блокировкой импорта, которые могут возникнуть из- за прямого импорта кода . Вы хотите
main()
запустить, если ваш файл был вызван напрямую (это__name__ == "__main__"
так), но если ваш код был импортирован, то импортер должен ввести ваш код из истинного основного модуля, чтобы избежать проблем блокировки импорта.Побочным эффектом является то, что вы автоматически входите в методологию, которая поддерживает несколько точек входа. Вы можете запустить свою программу, используя
main()
в качестве точки входа, но вам это не нужно . Покаsetup.py
ожидаетсяmain()
, другие инструменты используют альтернативные точки входа. Например, чтобы запустить ваш файл какgunicorn
процесс, вы определяетеapp()
функцию вместоmain()
. Так же, как и сsetup.py
,gunicorn
импортирует ваш код, так что вы не хотите, чтобы он делал что-то, пока он импортируется (из-за проблемы блокировки импорта).источник
Этот ответ для Java-программистов, изучающих Python. Каждый файл Java обычно содержит один открытый класс. Вы можете использовать этот класс двумя способами:
Вызовите класс из других файлов. Вы просто должны импортировать его в вызывающую программу.
Запустите класс самостоятельно, в целях тестирования.
В последнем случае класс должен содержать открытый статический метод void main (). В Python этой цели служит глобально определенный ярлык
'__main__'
.источник
Код под
if __name__ == '__main__':
будет выполняться только в том случае, если модуль вызывается как скрипт .В качестве примера рассмотрим следующий модуль
my_test_module.py
:1-я возможность: импорт
my_test_module.py
в другой модульТеперь, если вы вызываете
main.py
:Обратите внимание, что выполняется только
print()
оператор верхнего уровня вmy_test_module
.2-я возможность: вызывать
my_test_module.py
как скриптТеперь, если вы запускаете
my_test_module.py
как скрипт Python, обаprint()
оператора будут выполнены:источник
Каждый модуль в Python имеет атрибут с именем
__name__
. Значение__name__
атрибута - это__main__
когда модуль запускается напрямую, напримерpython my_module.py
. В противном случае (как, например, когда вы говоритеimport my_module
) значение__name__
- это имя модуля.Небольшой пример, чтобы объяснить вкратце.
Мы можем выполнить это непосредственно как
Вывод
Теперь предположим, что мы вызываем вышеуказанный скрипт из другого скрипта
Когда вы выполните это
Вывод
Итак, вышесказанное говорит само за себя, что при вызове test из другого скрипта цикл
__name__
intest.py
не будет выполняться.источник
Если этот файл .py импортирован другими файлами .py, код в «операторе if» не будет выполнен.
Если этот .py запущен
python this_py.py
под оболочкой, или дважды щелкните в Windows. код под «оператором if» будет выполнен.Обычно написано для тестирования.
источник
Если интерпретатор Python работает с определенным модулем, тогда значение
__name__
глобальной переменной будет иметь значение"__main__"
Когда вы запустите этот скрипт, вы увидите меня
a
Если вы импортируете этот файл, скажем, A, в файл B и выполните файл B, то
if __name__ == "__main__"
в файле A он станет ложным, поэтому он печатает .б
источник
Все ответы в значительной степени объяснили функциональность. Но я приведу один пример его использования, который может помочь прояснить концепцию дальше.
Предположим, что у вас есть два файла Python, a.py и b.py. Теперь a.py импортирует b.py. Мы запускаем файл a.py, где сначала выполняется код import b.py. Перед запуском остальной части кода a.py код в файле b.py должен выполняться полностью.
В коде b.py есть некоторый код, который является эксклюзивным для этого файла b.py, и мы не хотим, чтобы какой-либо другой файл (кроме файла b.py), который импортировал файл b.py, запустил его.
Вот что проверяет эта строка кода. Если это основной файл (т. Е. B.py), на котором выполняется код, а в данном случае это не так (a.py - основной файл, на котором выполняется), то выполняется только код.
источник
Создайте файл, a.py :
__name__
всегда равно__main__
всякий раз, когда этот файл запускается напрямую, показывая, что это основной файл.Создайте другой файл, b.py , в том же каталоге:
Запустить его. Он напечатает , то есть имя файла , который импортируется .
Итак, чтобы показать два разных поведения одного и того же файла , это часто используемый прием:
источник
если name == ' main ':
Видим ли
__name__ == '__main__':
довольно часто.Он проверяет, импортируется ли модуль или нет.
Другими словами, код внутри
if
блока будет выполняться только тогда, когда код выполняется напрямую. Вотdirectly
значитnot imported
.Давайте посмотрим, что он делает, используя простой код, который печатает имя модуля:
Если мы запустим код напрямую через
python test.py
, имя модуля будет__main__
:источник
Проще говоря, это точка входа для запуска файла, как и
main
функция в языке программирования C.источник
if __name__ == "__main__"
блоком не должно быть кода (кроме определений без побочных эффектов) . Технически вершина исполняемого скрипта является точкой входа в программу.