__Main__.py dosyası nedir?


326

__main__.pyDosya nedir , ne tür bir kod koymalıyım ve ne zaman girmeliyim?

Yanıtlar:


320

Genellikle, bir Python programı komut satırında bir .py dosyası adlandırılarak çalıştırılır:

$ python my_program.py

Ayrıca kodla dolu bir dizin veya zip dosyası oluşturabilir ve bir __main__.py. Ardından, dizini veya zip dosyasını komut satırında adlandırabilirsiniz ve __main__.pyotomatik olarak yürütür :

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

Başvurunuzun bu şekilde yürütülmekten fayda sağlayıp sağlayamayacağına kendiniz karar vermelisiniz.


Bir __main__ modülün genellikle bir __main__.pydosyadan gelmediğini unutmayın . Olabilir, ancak genellikle yoktur. Gibi bir komut dosyası çalıştırdığınızda, komut python my_program.pydosyası __main__modül yerine my_programmodül olarak çalışır. Bu, aynı python -m my_moduleşekilde veya başka şekillerde çalışan modüller için de geçerlidir .

Adı __main__bir hata mesajında gördüyseniz , bu mutlaka bir __main__.pydosya aradığınız anlamına gelmez .


22
Buldum python -m program_dirve python program_dirbiraz farklı: ikincisi asla __init__.pydizinde çalışır (varsa).
brk

5
@brk: Şu an böyle görünmüyor. Sadece denedim python3 program_dirve koştu __init__.py.
mk12

@ mk12 Sadece denedim @ brk bulgularını doğrulayabilirim: python3 dirçalışır __main__.pyama değil __init__.py, python3 -m dirher ikisi de çalışır.
Marcello Romani

1
@ mk12 Muhtemelen__main__.py__init__.py
wim

100

__main__.pyDosya ne için?

Bir Python modülü oluştururken main, programın giriş noktası olarak çalıştırıldığında modülün bazı işlevleri (genellikle bir işlevde bulunur) yürütmesi yaygındır . Bu genellikle çoğu Python dosyasının altına yerleştirilen aşağıdaki ortak deyimle yapılır:

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

İle bir Python paketi için aynı semantiği alabilirsiniz __main__.py. Bu bir linux kabuk $istemidir, Windows'ta Bash (veya başka bir Posix kabuğu) yoksa demo/__<init/main>__.py, EOFs arasında içerik bulunan şu dosyaları oluşturun :

$ 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

(Bir Posix / Bash kabuğunda, her bir cat komutunun sonunda dosya sonu karakteri + , girerek s olmadan ve << EOFs ile bitmeden yukarıdakileri yapabilirsiniz )EOFCtrlD

Ve şimdi:

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

Bunu belgeselden türetebilirsiniz. Dokümantasyon diyor ki:

__main__ - Üst düzey komut dosyası ortamı

'__main__'üst düzey kodun yürütüldüğü kapsamın adıdır. Bir modül , standart girişten, bir komut dosyasından veya etkileşimli bir istemden okunduğunda __name__eşittir '__main__'.

Bir modül kendi kapsamını kontrol ederek ana kapsamda çalışıp çalışmadığını keşfedebilir __name__, bu da bir kod olarak çalıştırıldığında veya python -miçe aktarıldığında değil , bir modülde koşullu olarak kod yürütmek için ortak bir deyim sağlar :

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

Bir paket için, aynı etki, __main__.pymodülün çalıştırıldığı sırada içeriği yürütülecek olan bir modül eklenerek elde edilebilir -m.

Sıkıştırılmış

Bunu tek bir dosyaya da paketleyebilir ve komut satırından şu şekilde çalıştırabilirsiniz - ancak sıkıştırılmış paketlerin alt paketleri veya alt modülleri giriş noktası olarak yürütemeyeceğini unutmayın:

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

31

__main__.pyzip dosyalarındaki python programları için kullanılır. __main__.pyZip dosyası çalıştırıldığında dosya çalıştırılacaktır. Örneğin, zip dosyası şöyle ise:

test.zip
     __main__.py

ve içerikleri __main__.pyoldu

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

Sonra koşacak python test.zip worldolsaydık hello worlddışarı çıkardık.

Bu yüzden __main__.pybir zip dosyasında python çağrıldığında dosya çalışır.


23

Oluşturabilir __main__.pyiçinde yourpackagegibi çalıştırılabilir yapmak için:

$ python -m yourpackage

1
-myalnızca program modül olarak erişilebilir çalışır, başka kullanabilirsiniz python <yourpackage>NOT: olmadan -mseçeneği
Benyamin Jafari

1
@ BenyaminJafari Modül olarak erişilemeyen komut satırı Python programını yazmak mümkün değildir . Belki demek istedin package?
anatoly techtonik

1
main .py dosyasını içeren bir Python paketi oluşturduğumuzda , onu çalıştırmak python -m <yourproject>işe yaramaz, -mgereksiz bir seçenektir, ancak python <yourpackage>iyi çalışır.
Benyamin Jafari

@BenyaminJafari -m bayrağı bazı durumlarda fark yaratır. Dizinden yürütme ave komut dosyası varsayma a/b/c/__main__.py... dizinden yürütülür ve ana komut dosyasının içe aktarması göreceli olur . Ancak dir alma kapsamından yürütülür ve böylece ana komut dosyasında olduğu gibi herhangi bir ithalat başarısız olur. python -m b.caapython b/ccimport b.d
MikeCPT

14

Komut dosyanız tek bir python dosyası yerine bir dizin veya ZIP dosyasıysa __main__.py, "komut dosyası" python yorumlayıcısına argüman olarak iletildiğinde yürütülür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.