Для чого __main__.pyфайл, який код я повинен в нього вкласти, і коли я повинен мати його?
Для чого __main__.pyфайл, який код я повинен в нього вкласти, і коли я повинен мати його?
Відповіді:
Часто програма 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файл.
python3 program_dirі він побіг __init__.py.
python3 dirпрацює, __main__.pyале ні __init__.py, тоді як python3 -m dirвиконує обидва.
__main__.pyякого було спровоковано імпорт__init__.py
__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
__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-файлі.
Ви створюєте __main__.pyв , yourpackageщоб зробити його виконуваним , як:
$ python -m yourpackage
-mпрацює, якщо тільки програма доступна як модуль, інакше ви можете використовувати python <yourpackage>ПРИМІТКА: без -mопції
package?
python -m <yourproject>не працює, -mє надмірним варіантом, але python <yourpackage>працює добре.
aта припущення сценарію a/b/c/__main__.py... python -m b.cбуде виконуватися з каталогу, aа імпорт основного сценарію буде відносно a. Але python b/cбуде виконуватися з області імпорту dir, cі тому будь-який імпорт, як у головному сценарії, як import b.d, не вдасться.
python -m program_dirіpython program_dirтрохи інше: останній ніколи не запускається__init__.pyв каталог (якщо такий є).