Apa itu __main__.py?

326

Untuk apa __main__.pyfile itu, kode seperti apa yang harus saya masukkan ke dalamnya, dan kapan saya harus memilikinya?

Monika Sulik
sumber

Jawaban:

320

Seringkali, program Python dijalankan dengan menamai file .py pada baris perintah:

$ python my_program.py

Anda juga dapat membuat direktori atau file zip penuh dengan kode, dan termasuk a __main__.py. Kemudian Anda cukup memberi nama direktori atau file zip pada baris perintah, dan menjalankan __main__.pysecara otomatis:

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

Anda harus memutuskan sendiri apakah aplikasi Anda dapat mengambil manfaat dari dieksekusi seperti ini.


Perhatikan bahwa __main__ modul biasanya tidak berasal dari __main__.pyfile. Memang bisa, tetapi biasanya tidak. Ketika Anda menjalankan skrip suka python my_program.py, skrip akan berjalan sebagai __main__modul, bukan my_programmodul. Ini juga terjadi untuk modul yang dijalankan seperti python -m my_module, atau dalam beberapa cara lain.

Jika Anda melihat nama __main__dalam pesan kesalahan, itu tidak berarti Anda harus mencari __main__.pyfile.

Ned Batchelder
sumber
22
Saya menemukan python -m program_dirdan python program_dirsedikit berbeda: yang terakhir tidak pernah berjalan __init__.pydi direktori (jika ada).
brk
5
@ brk: Sepertinya bukan itu masalahnya sekarang. Saya hanya mencoba python3 program_dirdan berlari __init__.py.
mk12
@ mk12 Saya baru mencobanya Saya dapat mengkonfirmasi temuan @ brk: python3 dirberjalan __main__.pytetapi tidak __init__.py, sedangkan python3 -m dirmenjalankan keduanya.
Marcello Romani
1
@ mk12 Mungkin Anda memiliki beberapa kode __main__.pyyang memicu impor__init__.py
wim
100

Untuk apa __main__.pyfile itu?

Saat membuat modul Python, adalah umum untuk membuat modul menjalankan beberapa fungsi (biasanya terkandung dalam suatu mainfungsi) ketika dijalankan sebagai titik masuk program. Ini biasanya dilakukan dengan idiom umum berikut yang ditempatkan di bagian bawah sebagian besar file Python:

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

Anda bisa mendapatkan semantik yang sama untuk paket Python __main__.py. Ini adalah prompt shell linux $,, jika Anda tidak memiliki Bash (atau shell Posix lain) di Windows, buat saja file-file ini demo/__<init/main>__.pydengan konten di antara 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

(Dalam shell Posix / Bash, Anda dapat melakukan hal di atas tanpa huruf << EOFs dan mengakhiri EOFdengan memasukkan Ctrl+ D, karakter akhir file, di akhir setiap perintah cat)

Dan sekarang:

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

Anda dapat memperoleh ini dari dokumentasi. The dokumentasi mengatakan:

__main__ - Lingkungan skrip tingkat atas

'__main__'adalah nama ruang lingkup di mana kode tingkat atas dijalankan. Modul __name__diatur sama dengan '__main__'ketika dibaca dari input standar, skrip, atau dari prompt interaktif.

Modul dapat menemukan apakah itu berjalan dalam lingkup utama dengan memeriksa sendiri atau tidak __name__, yang memungkinkan idiom umum untuk mengeksekusi kode secara kondisional dalam modul ketika dijalankan sebagai skrip atau dengan python -mtetapi tidak ketika diimpor:

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

Untuk suatu paket, efek yang sama dapat dicapai dengan memasukkan __main__.pymodul, yang isinya akan dieksekusi ketika modul dijalankan -m.

Zip

Anda juga dapat mengemas ini ke dalam satu file dan menjalankannya dari baris perintah seperti ini - tetapi perhatikan bahwa paket zip tidak dapat menjalankan sub-paket atau submodula sebagai titik masuk:

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

__main__.pydigunakan untuk program python dalam file zip. The __main__.pyfile akan dieksekusi ketika file zip di jalankan. Misalnya, jika file zipnya seperti itu:

test.zip
     __main__.py

dan isi __main__.pyadalah

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

Maka jika kita lari python test.zip worldkita akan hello worldkeluar.

Jadi __main__.pyfile dijalankan ketika python dipanggil pada file zip.

Paprika biru
sumber
23

Anda membuat __main__.pydi yourpackageuntuk membuatnya dieksekusi sebagai:

$ python -m yourpackage
techtonik anatoly
sumber
1
-mberfungsi jika hanya program yang dapat diakses sebagai modul, kalau tidak Anda bisa menggunakan python <yourpackage>CATATAN: tanpa -mopsi
Benyamin Jafari
1
@BenyaminJafari tidak mungkin menulis program baris perintah Python yang tidak dapat diakses sebagai modul . Mungkin maksudmu package?
anatoly techtonik
1
ketika kita membuat paket Python yang berisi .py utama , untuk menjalankannya python -m <yourproject>tidak berfungsi, -madalah opsi yang berlebihan, tetapi python <yourpackage>berfungsi dengan baik.
Benyamin Jafari
@BenyaminJafari Bendera -m memang membuat perbedaan dalam beberapa kasus. Eksekusi dari direktori adan asumsi skrip a/b/c/__main__.py... python -m b.cakan dijalankan dari direktori adan impor skrip utama akan relatif terhadap a. Tetapi python b/cakan mengeksekusi dari lingkup impor dir cdan setiap impor seperti di skrip utama seperti import b.dakan gagal.
MikeCPT
14

Jika skrip Anda adalah direktori atau file ZIP daripada file python tunggal, __main__.pyakan dieksekusi ketika "skrip" diteruskan sebagai argumen ke interpreter python.

Wooble
sumber