Untuk apa __main__.pyfile itu, kode seperti apa yang harus saya masukkan ke dalamnya, dan kapan saya harus memilikinya?
Untuk apa __main__.pyfile itu, kode seperti apa yang harus saya masukkan ke dalamnya, dan kapan saya harus memilikinya?
Jawaban:
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.
python3 program_dirdan berlari __init__.py.
python3 dirberjalan __main__.pytetapi tidak __init__.py, sedangkan python3 -m dirmenjalankan keduanya.
__main__.pyyang memicu impor__init__.py
__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 denganpython -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.
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
__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.
Anda membuat __main__.pydi yourpackageuntuk membuatnya dieksekusi sebagai:
$ python -m yourpackage
-mberfungsi jika hanya program yang dapat diakses sebagai modul, kalau tidak Anda bisa menggunakan python <yourpackage>CATATAN: tanpa -mopsi
package?
python -m <yourproject>tidak berfungsi, -madalah opsi yang berlebihan, tetapi python <yourpackage>berfungsi dengan baik.
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.
python -m program_dirdanpython program_dirsedikit berbeda: yang terakhir tidak pernah berjalan__init__.pydi direktori (jika ada).