Що таке __main__.py?


326

Для чого __main__.pyфайл, який код я повинен в нього вкласти, і коли я повинен мати його?

Відповіді:


320

Часто програма Python запускається шляхом іменування .py-файлу в командному рядку:

$ python my_program.py

Ви також можете створити каталог або zipfile, повний коду, і включити __main__.py. Тоді ви можете просто назвати каталог або zipfile в командному рядку, і він виконується __main__.pyавтоматично:

$ python my_program_dir
$ python my_program.zip
# Or, if the program is accessible as a module
$ python -m my_program

Вам доведеться самостійно вирішити, чи може ваша програма отримати користь від виконання такого виконання.


Зауважте, що __main__ модуль зазвичай не надходить з __main__.pyфайлу. Це може, але зазвичай ні. Коли ви запускаєте такий сценарій, як python my_program.pyсценарій __main__замість модуля буде працювати як my_programмодуль. Це також відбувається для модулів, які працюють як python -m my_moduleабо декількома іншими способами.

Якщо ви побачили ім'я __main__в повідомленні про помилку, це не обов'язково означає, що вам слід шукати __main__.pyфайл.


22
Я знайшов python -m program_dirі python program_dirтрохи інше: останній ніколи не запускається __init__.pyв каталог (якщо такий є).
брк

5
@brk: Мабуть, зараз це не так. Я просто спробував, python3 program_dirі він побіг __init__.py.
Mk12

@ mk12 Я щойно спробував це, я можу підтвердити висновки @ brk: python3 dirпрацює, __main__.pyале ні __init__.py, тоді як python3 -m dirвиконує обидва.
Марчелло Романі

1
@ mk12 Ймовірно, у вас був якийсь код, всередині __main__.pyякого було спровоковано імпорт__init__.py
wim

100

Для чого __main__.pyфайл?

Під час створення модуля Python прийнято змушувати модуль виконувати деяку функціональність (зазвичай міститься у mainфункції) при запуску в якості точки входу програми. Зазвичай це робиться за допомогою наступної загальної ідіоми, розміщеної внизу більшості файлів Python:

if __name__ == '__main__':
    # execute only if run as the entry point into the program
    main()

Ви можете отримати ту саму семантику для пакета Python __main__.py. Це підказка оболонки Linux $, якщо у вас немає Bash (або іншої оболонки Posix) у Windows, просто створіть ці файли у demo/__<init/main>__.pyзі вмістом між EOFs:

$ mkdir demo
$ cat > demo/__init__.py << EOF
print('demo/__init__.py executed')
def main():
    print('main executed')
EOF
$ cat > demo/__main__.py << EOF
print('demo/__main__.py executed')
from __init__ import main
main()
EOF

(У оболонці Posix / Bash ви можете зробити вищезазначене без << EOFs та закінчення EOFs, ввівши Ctrl+ D, символ кінця файлу, наприкінці кожної команди cat)

А зараз:

$ python demo
demo/__main__.py executed
demo/__init__.py executed
main executed

Це можна отримати з документації. Документація каже:

__main__ - Середовище сценарію верхнього рівня

'__main__'- назва області, у якій виконується код верхнього рівня. Модуль __name__встановлюється рівним, '__main__'коли читається зі стандартного вводу, сценарію або з інтерактивного запиту.

Модуль може виявити, чи працює він у основному просторі, перевіривши його власне __name__, що дозволяє загальній ідіомі для умовного виконання коду в модулі, коли він запускається як сценарій або з, python -mале не, коли він імпортується:

if __name__ == '__main__':
      # execute only if run as a script
      main()

Для пакету такого ж ефекту можна досягти, включивши __main__.pyмодуль, вміст якого буде виконуватися при запуску модуля -m.

На блискавці

Ви також можете упакувати це в один файл і запустити його з командного рядка, як це - але зауважте, що пакунки, що переносяться, не можуть виконувати підпакети або підмодулі як точку входу:

$ python -m zipfile -c demo.zip demo/*
$ python demo.zip
demo/__main__.py executed
demo/__init__.py executed
main() executed

31

__main__.pyвикористовується для програм python у zip-файлах. __main__.pyФайл буде виконаний , коли поштовий файл в запуску. Наприклад, якщо zip-файл був таким:

test.zip
     __main__.py

і зміст __main__.pyбув

import sys
print "hello %s" % sys.argv[1]

Тоді якби ми бігли, python test.zip worldми hello worldвийшли б.

Отже, __main__.pyфайл запускається, коли python викликається на zip-файлі.


23

Ви створюєте __main__.pyв , yourpackageщоб зробити його виконуваним , як:

$ python -m yourpackage

1
-mпрацює, якщо тільки програма доступна як модуль, інакше ви можете використовувати python <yourpackage>ПРИМІТКА: без -mопції
Benyamin Jafari

1
@BenyaminJafari неможливо написати командний рядок програми Python, яка недоступна як модуль . Може, ти мав на увазі package?
anatoly techtonik

1
коли ми створюємо пакет Python, який містить основний .py, запуск його python -m <yourproject>не працює, -mє надмірним варіантом, але python <yourpackage>працює добре.
Бенямін Джафарі

@BenyaminJafari Прапор -m в деяких випадках має значення. Виконання з каталогу aта припущення сценарію a/b/c/__main__.py... python -m b.cбуде виконуватися з каталогу, aа імпорт основного сценарію буде відносно a. Але python b/cбуде виконуватися з області імпорту dir, cі тому будь-який імпорт, як у головному сценарії, як import b.d, не вдасться.
MikeCPT

14

Якщо ваш скрипт - це каталог або ZIP-файл, а не один файл python, __main__.pyвін буде виконуватися, коли "скрипт" передається як аргумент інтерпретатору python.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.