__main__.pyDosya nedir , ne tür bir kod koymalıyım ve ne zaman girmeliyim?
__main__.pyDosya nedir , ne tür bir kod koymalıyım ve ne zaman girmeliyim?
Yanıtlar:
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 .
python3 program_dirve koştu __init__.py.
python3 dirçalışır __main__.pyama değil __init__.py, python3 -m dirher ikisi de çalışır.
__main__.py__init__.py
__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 veyapython -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.
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
__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.
Oluşturabilir __main__.pyiçinde yourpackagegibi çalıştırılabilir yapmak için:
$ python -m yourpackage
-myalnızca program modül olarak erişilebilir çalışır, başka kullanabilirsiniz python <yourpackage>NOT: olmadan -mseçeneği
package?
python -m <yourproject>işe yaramaz, -mgereksiz bir seçenektir, ancak python <yourpackage>iyi çalışır.
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
python -m program_dirvepython program_dirbiraz farklı: ikincisi asla__init__.pydizinde çalışır (varsa).