Что делать, если __name__ == "__main__": делать? - PullRequest
5063 голосов
/ 07 января 2009

Что делает 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))

Ответы [ 28 ]

12 голосов
/ 14 марта 2017

Вы можете сделать файл пригодным для использования как скрипт , а также как импортируемый модуль .

fibo.py (модуль с именем fibo)

# Other modules can IMPORT this MODULE to use the function fib
def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

# This allows the file to be used as a SCRIPT
if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

Ссылка: https://docs.python.org/3.5/tutorial/modules.html

7 голосов
/ 07 октября 2018

Этот ответ для Java-программистов, изучающих Python. Каждый файл Java обычно содержит один открытый класс. Вы можете использовать этот класс двумя способами:

  1. Вызовите класс из других файлов. Вы просто должны импортировать его в вызывающую программу.

  2. Запустите класс самостоятельно, для целей тестирования.

В последнем случае класс должен содержать открытый статический метод void main (). В Python этой цели служит глобально определенный ярлык '__main__'.

5 голосов
/ 19 июня 2018

Если этот файл .py импортирован другими файлами .py, код в «операторе if» не будет выполнен.

Если этот .py запущен python this_py.py под оболочкой, или дважды щелкните в Windows. код под «оператором if» будет выполнен.

Обычно написано для тестирования.

4 голосов
/ 08 января 2018

Создать файл, a.py :

print(__name__) # It will print out __main__

__name__ всегда равно __main__ всякий раз, когда этот файл запускается напрямую , показывая, что это основной файл.

Создайте другой файл, b.py , в том же каталоге:

import a  # Prints a

Запустите его. Он напечатает a , т.е. имя файла, который импортируется .

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

# Code to be run when imported into another python file

if __name__ == '__main__':
    # Code to be run only when run directly
3 голосов
/ 04 апреля 2018

если имя == ' main ':

Видим ли __name__ == '__main__': довольно часто.

Проверяет, импортируется ли модуль или нет.

Другими словами, код в блоке if будет выполняться только тогда, когда код выполняется напрямую. Здесь directly означает not imported.

Давайте посмотрим, что он делает, используя простой код, который печатает название модуля:

# test.py
def test():
   print('test module name=%s' %(__name__))

if __name__ == '__main__':
   print('call test()')
   test()

Если мы запустим код напрямую через python test.py, имя модуля будет __main__:

call test()
test module name=__main__
3 голосов
/ 04 мая 2018

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

Предположим, что у вас есть два файла 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 - основной файл, на котором выполняется), то выполняется только код.

2 голосов
/ 03 февраля 2019

Просто это точка входа для запуска файла, подобного функции main на языке программирования C .

0 голосов
/ 12 июня 2019

Каждый модуль в Python имеет атрибут, который называется name . Значение атрибута name равно ' main ' при непосредственном запуске модуля. В противном случае значение name является именем модуля.

Небольшой пример для краткого объяснения.

#Script test.py

apple = 42

def hello_world():
    print("I am inside hello_world")

if __name__ == "__main__":
    print("Value of __name__ is: ", __name__)
    print("Going to call hello_world")
    hello_world()

Мы можем выполнить это непосредственно как

python test.py  

выход

Value of __name__ is: __main__
Going to call hello_world
I am inside hello_world

Теперь предположим, что мы вызываем вышеуказанный скрипт из другого скрипта

#script external_calling.py

import test
print(test.apple)
test.hello_world()

print(test.__name__)

Когда вы выполните это

python external_calling.py

выход

42
I am inside hello_world
test

Итак, приведенное выше говорит само за себя, что при вызове test из другого скрипта цикл name в test.py не будет выполняться.

...