__Name__ == "__main__" əgər nə etməli?

if __name__ == "__main__": nədir?

 # Threading example import time, thread def myfunction(string, sleeptime, lock, *args): while True: lock.acquire() time.sleep(sleeptime) lock.release() time.sleep(sleeptime) if __name__ == "__main__": lock = thread.allocate_lock() thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock)) thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock)) 
4596
07 янв. 07 yanvarda bəxş edilmiş 2009-01-07 07:11 '09 at 07:11 2009-01-07 07:11
@ 30 cavab

Python tərcüməçi qaynaq faylını oxuduğunda, onun içindəki bütün kodu yerinə yetirir.

Kodu yerinə yetirmədən əvvəl, bir neçə xüsusi dəyişən müəyyən edəcək. Python tərcüməçi, əsas proqram olaraq Python tərcüməçinin bu modulu (qaynaq faylını) __name__ xüsusi dəyişənini "__main__" dəyərinə "__main__" . Bu fayl başqa bir __name__ , __name__ idxal modulunun adına təyin olunacaq.

Ssenarinizin halda, məsələn, əsas funksiyası kimi icra edildiyini varsayalım, məsələn, bir şey dediniz

 python threading_example.py 

komanda xəttində. Xüsusi dəyişənləri qurduqdan sonra import bəyanatını yerinə yetirəcək və bu modulları yükləyəcək. Sonra bir funksiya obyekti yaratmaq və funksiya obyektinə myfunction edən dəyişən bir funksiyanı yaradaraq def blokunu qiymətləndirir. Sonra if oxuyur və __name__ "__main__" olduğunu __name__ , buna görə orada göstərilən bloku icra edər.

Bunun səbəblərindən biri bəzən birbaşa həyata keçirilə biləcək bir modul .py (bir .py fayl). Ayrıca, başqa bir modulda da idxal və istifadə edilə bilər. Əsas bir çek həyata keçirməklə, bu kodu yalnız modulu bir proqram kimi başlamağınız və yalnız birinin modulunuzu idxal etmək və funksiyalarınızı özünüzə çatdırmaq istədikdə başlamamaq üçün istəyə bilərsiniz.

Bəzi əlavə məlumatlar üçün bu səhifəyə baxın.

Qeyd (Staines tərəfindən): Əgər kodun funksiya təsviri qarşısında __name__ yoxlanılmadan əvvəl icra ediləcəkdir.

 print("This code executes before main.") def functionA(): print("Function A") def functionB(): print("Function B") if __name__ == '__main__': functionA() functionB() 

Bu modul əsas olaraq əsas skript kimi istifadə edilirsə, bu kod aşağıdakı nəticələrə gətirib çıxarır:

 This code executes before main. 
4918
07 янв. Cavab cənab Fooz'a verildi 07 Yanvar 2009-01-07 07:26 '09 at 07:26 2009-01-07 07:26

Ssenariniz Python tercümanına bir komut olaraq keçirildikdə,

 python myscript.py 

bütün kod 0-indent səviyyəsində yerinə yetirilir. Bəzi funksiyalar və siniflər müəyyən edilir, lakin müəyyən edilmir, amma kodlarının heç biri başlamaz. Başqa dillərdən fərqli olaraq, avtomatik olaraq başlayan main() funksiyası yoxdur - main() funksiyası üst səviyyədə bütün kodları əhatə edir.

Bu halda üst səviyyəli kod bir if blokudur. __name__ cari modulun adını qiymətləndirən daxili dəyişəndir. Bununla belə, modul birbaşa başlamışsa (yuxarıda myscript.py kimi), "__main__" yerinə "__main__" __name__ . Bu yolla, scriptinizi sınanaraq birbaşa icra edildiyini və ya başqa bir şey idxal etdiyini yoxlaya bilərsiniz

 if __name__ == "__main__": ... 

Ssenariniz başqa bir modulda idxal edildiyində, onun müxtəlif funksiyası və sinif anlayışları idxal ediləcək və üst səviyyəli kod yerinə yetiriləcək, lakin yuxarıda göstərilən eyni testdə kodu 'əldə etməliyəm, çünki şərt yerinə yetirilmir. Əsas bir nümunə olaraq aşağıdakı iki ssenariyi nəzərdən keçirin:

 # file one.py def func(): print("func() in one.py") print("top-level in one.py") if __name__ == "__main__": print("one.py is being run directly") else: print("one.py is being imported into another module") 
 # file two.py import one print("top-level in two.py") one.func() if __name__ == "__main__": print("two.py is being run directly") else: print("two.py is being imported into another module") 

Tərcüməçini zəng etsəniz, indi

border=0
 python one.py 

Çıxış olacaq

 top-level in one.py one.py is being run directly 

two.py çalıştırıyorsanız:

 python two.py 

Siz almaq

 top-level in one.py one.py is being imported into another module top-level in two.py func() in one.py two.py is being run directly 

Beləliklə, one modul yüklənərkən, __name__ "__main__" yerinə "one" "__main__" .

1568
07 янв. cavab Adam Rosenfield 07 jan tərəfindən verilir . 2009-01-07 07:28 '09 da 07:28 'da 2009-01-07 07:28

__name__ (imho) dəyişəninin ən sadə izahı aşağıdakılardır:

Aşağıdakı faylları yaradın.

 # a.py import b 

və həmçinin

 # b.py print "Hello World from %s!" % __name__ if __name__ == '__main__': print "Hello World again from %s!" % __name__ 

Onları ataraq, aşağıdakı nəticəni alırsınız:

 $ python a.py Hello World from b! 

Gördüyünüz kimi, bir modul idxal edildikdə, Python bu globals()['__name__'] modul adına verir. Ayrıca, idxal edərkən, moduldakı bütün kod işlədilir. if False olaraq qiymətləndirilirsə False bu hissə icra edilmir.

 $ python b.py Hello World from __main__! Hello World again from __main__! 

Gördüyünüz kimi, fayl icra edildikdə, Python bu faylda "__main__" üçün globals()['__name__'] quraşdırır. Bu dəfə if True olaraq qiymətləndirilir və icra edilir.

607
Cavab pi verilir . Jan 07 2009-01-07 14:35 '09 saat 14:35 'da 2009-01-07 14:35

if __name__ == "__main__": nədir?

Əsasları təsvir etmək üçün:

  • Proqramın giriş nöqtəsi olan __name__ qlobal dəyişən '__main__' dir. Əks halda, bu, modul idxal etdiyiniz adıdır.

  • Beləliklə, if bloku altında olan kod yalnız modul proqramın giriş nöqtəsi olduqda işlədiləcəkdir.

  • Kod, idxal altında kodu blok etmədən başqa modullarla modul daxilində idxal etməyə imkan verir.


Bizə nə lazımdır?

Kod İnkişafı və Testi

Bir modul olaraq istifadə üçün nəzərdə tutulan bir Python skript yazırsınız:

 def do_important(): """This function does something very important""" 

Aşağıdakı funksiyanı zəng əlavə edərək modulu test edə bilərsiniz:

 do_important() 

və (komanda satırında) kimi bir şeylə çalışan:

 ~$ python important.py 

Problem

Ancaq bir modul başqa bir skriptə daxil etmək istəyirsinizsə:

 import important 

İthalat do_important funksiyasını do_important , buna görə də do_important() aşağıdakı do_important() funksiyasına şərh edəcəyik.

 # do_important() # I must remember to uncomment to execute this! 

Və sonra test funksiyasına zəng etməyinizi şərh edərkən yadda saxlamaq lazımdır. Və bu əlavə mürəkkəblik, ehtimal ki, inkişaf prosesini daha çətinləşdirən şeyləri unutduğunuz deməkdir.

Ən yaxşı yol

Python tərcüməçisi hazırda yerləşdiyi yerdə, dəyişən __name__ ad boşluğuna istinad edir.

İthal modulun içərisində bu modulun adıdır.

Amma əsas modul (və ya Python interaktiv sessiyası, yəni, Tərcüməçi oxu, Eval, Print loop və ya REPL tərcüməçi) "__main__" hər şeyi "__main__" dən başlayırsınız.

Beləliklə, əgər əvvəl yoxlayarsanız:

 if __name__ == "__main__": do_important() 

Yuxarıdakı kodunuz yalnız əsas modul kimi istifadə edərsə (və ya qəsdən başqa bir ssenaridən çağırsanız) yerinə yetiriləcəkdir.

Daha yaxşı bir yol

Bunu yaxşılaşdırmaq üçün Python yolu var.

Bu iş prosesini modul xaricindən həyata keçirmək istəyiriksə?

Bu funksiyanı inkişaf etdirdikdə və test edərkən tətbiq etmək istədiyimiz kodu '__main__' dərhal sonra '__main__' üçün '__main__' :

 def main(): """business logic for when running this module as the primary one!""" setup() foo = do_important() bar = do_even_more_important(foo) for baz in bar: do_super_important(baz) teardown() # Here our payoff idiom! if __name__ == '__main__': main() 

İndi modulumuzun sonu üçün son funksiyaya sahibik. Bu, modulun əsas modul kimi işlədilməsi üçün işləyəcəkdir.

Bu, main funksiyaya başlamadan modul və funksiyaları və siniflərin digər skriptlərə idxal edilməsinə imkan verəcəkdir və başqa bir '__main__' dən işləyərkən modul (və funksiyaları və sinifləri) adlandırmağa imkan verir.

 import important important.main() 

Bu deyim də __main__ modul izahatında Python sənədlərində tapıla bilər. Bu mətndə deyilir:

Bu modul (əsasən anonim) əsas tercüman proqramının ya standart girişdən, bir skript faylından və ya interaktiv istəniləndən oxunan əmr olduğu bir sahəni təmsil edir. Bu, idiomatik "şərti skript" lenti scriptin işləməsinə səbəb olan mühitdir:

 if __name__ == '__main__': main() 
449
23 нояб. Cavab 23 noyabrda Aaron Hall tərəfindən verilir. 2013-11-23 07:38 '13 saat 07:38 'da 2013-11-23 07:38

if __name__ == "__main__" skripti python myscript.py kimi bir python myscript.py istifadə edərək, əmr satırından (deyilən) başlandığında icra edilən hissəsidir.

100
07 янв. Harley Holcombe tərəfindən verilmiş cavab 07 Jan 2009-01-07 07:14 '09 at 07:14 2009-01-07 07:14

if __name__ == "__main__": nədir?

__name__ mövcud olan qlobal bir dəyişkəndir (Python, qlobal həqiqətən modul səviyyəsində deməkdir). Adətən bu modulun adıdır (növü str )

Lakin, yalnız xüsusi hal kimi, hər hansı bir Python prosesində, mycode.py də olduğu kimi:

 python mycode.py 

əks halda anonim qlobal ad boşluğuna '__main__' dəyəri verilir.

Beləliklə son xətlər daxildir

 if __name__ == '__main__': main() 
  • mycode.py skriptinin sonunda,
  • python prosesi ilə başlayan əsas başlanğıc nöqtəsi modulu olduqda,

unikal funksiya main skriptinin icrasına gətirib çıxaracaqdır.

Bu konstruktdan istifadə etmək üçün digər bir üstünlük: Kodunuzu başqa bir skriptə modul kimi də daxil edə bilərsiniz və sonra əsas funksiyanı və proqramınız qərar verdiyində:

 import mycode # ... any amount of other code mycode.main() 
66
14 окт. Cavab 14 oktyabrda Aaron Hall tərəfindən verilir . 2014-10-14 23:22 '14 da 23:22 2014-10-14 23:22

Sözügedən kodun mexanikası haqqında çox fərqli fikirlər var: "Nə", ancaq "Niyə" anlamadığım üçün mənim üçün məntiqi olmadı. Bu yeni proqramçılar üçün xüsusilə faydalı olmalıdır.

"Ab.py" faylını alın:

 def a(): print('A function in ab file'); a() 

Və ikinci fayl "xy.py":

 import ab def main(): print('main function: this is where the action is') def x(): print ('peripheral task: might be useful in other projects') x() if __name__ == "__main__": main() 

Bu kod həqiqətən nə edir?

xy.py , import ab . İxrac bəyanatı idxaldan dərhal modul başlayır, belə ki ab əməliyyatları xy qalan hissəsi qədər həyata keçirilir. ab ilə xy ilə davam edəcək.

Tərcüməçi, hansı skriptlərin __name__ ilə __name__ . Bir skript çalıştırdığınızda - onu nə "__main__" , tərcüməçi onu "__main__" adlandırır və bu, xarici skript "__main__" sonra qaytarılmış bir master və ya "ev" skripti təşkil edir.

Bu skriptdən "__main__" adlı başqa hər hansı bir skript onun fayl adını __name__ (məsələn __name__ == "ab.py" ) kimi təyin edir. Buna görə, xətt, if __name__ == "__main__": əgər başlanğıc yerinə yetirilən "ev" ssenarisini şərh edərsə və ya müvəqqəti olaraq başqa bir (xarici) skriptə if __name__ == "__main__": , test tercümanıdır. Bu, birbaşa həyata keçirildiyi və ya kənardan çağırıldığı təqdirdə, scriptin fərqli şəkildə davranması üçün proqramçıya rahatlıq verir.

Əvvəla qeyd edilməyən xətləri və ssenarilərdə təmsil etdikləri qaydaya odaklanaraq baş verənləri anlamaq üçün yuxarıdakı koddan keçməyimə icazə verin. Unutmayın ki, funksiyalar - ya da def - bloklar özləri tərəfindən çağırılana qədər heç bir şey etməzlər. Tərcüməçi özünə mə'ruz qaldıqda nə edə bilər:

  • Xy.py faylını "ev" faylı olaraq açın; __name__ dəyişənində "__main__" adını verin.
  • Faylı __name__ == "ab.py" ilə idxal et və açın.
  • Oh, funksiyası. Bunu xatırlayacağam.
  • Yaxşı, a() ; Mən yalnız bu mövzunu öyrəndim. "Ab faylında funksiya" yazdırın.
  • Faylın sonu; geri "__main__" !
  • Oh, funksiyası. Bunu xatırlayacağam.
  • Bir daha.
  • Funksiyası x() ; ok, çap "periferik vəzifə: digər layihələrdə faydalı ola bilər."
  • Bu nədir? if Bəli, şərt yerinə yetirilir ( __name__ dəyişən "__main__" təyin olunur), beləliklə main() funksiyanı daxil edəcəyəm və "əsas funksiya: hərəkətin olduğu yerdir".

Aşağı iki "__main__" deməkdir: "Bu "__main__" və ya" ev "bir skript varsa, funksiyanı main() funksiyasını yerinə "__main__" . Ona görə də def main(): funksiyasını görürsünüz def main(): skript funksiyalarının əsas axını olan yuxarı blok.

Niyə tətbiq edirsiniz?

Əvvəl idxal ərizələri haqqında nə dedim? Bir modul idxal edərkən, onu "tanıyır" və başqa tapşırıqları gözləyir - əslində skriptdə olan bütün əməliyyatları həyata keçirir. Beləliklə, skriptinizin ətini main() funksiyasına əlavə etmək, onu başqa bir skriptdən istifadə edərkən dərhal başlamaması üçün onu karantinaya qoyur.

Yenə də istisnalar olacaq, amma adi təcrübə main() adətən xarici olaraq adlandırılmır. Buna görə də bir şey daha maraqlı ola bilər: əgər main() çağırmazsak, niyə biz də scripti çağırırıq? Bunun səbəbi, bir çox insanın faylındakı qalan koddan asılı olaraq müstəqil fəaliyyət göstərmək üçün yaradılan özerk funksiyaları olan skriptləri yaratmasıdır. Daha sonra, başqa bir yerdə scriptin mətnində deyilir. Bu məni bu vəziyyətə gətirir:

Lakin kodu olmadan işləyir.

Bəli, bu doğru. Bu fərdi funksiyalar main() funksiyası içindəki daxili skriptdən çağırılmalıdır. Əgər ehtiyac duyduğunuz şeyi dəqiqləşdirən quraşdırılmış skriptlər yaratmaq üçün (mənim kimi, proqramlaşdırma prosesinin erkən mərhələlərində) istifadə edərsənsə və yenə də bu əməliyyata ehtiyac duyarsanız yenidən işləməyə çalışacaqsınız. Yaxşı, kodunuzun belə bir daxili quruluşuna alışmırsınız, çünki qurmaq daha çətindir və bu asan deyil.

Ancaq bu, ehtimal ki, xarici funksiyaları yerinə yetirə bilməyəcək bir ssenaridir, çünki o bunu etməsi halında dərhal dəyişənləri hesablamaq və təyin etməyə başlayırdı. Və, ehtimal ki, funksiyanı təkrar istifadə etməyə çalışarsanız, yeni skriptiniz köhnə ilə yaxından əlaqələnir, ziddiyyətli dəyişənlər olacaqdır.

Müstəqil funksiyaları bölüşməklə, əvvəlki işinizi başqa bir ssenaridə çağıraraq yenidən istifadə imkanı əldə edirsiniz. Misal üçün, example.py xy.py'yi idxal edə və x() x) funksiyasını xy.py-dən x funksiyasından istifadə edə bilər. (Yəqin ki, bir mətn xəttinin üçüncü sözünü düzəldir, ədədlər siyahısından NumPy array yaradır və onları kvadratlarda və ya üçölçülü səthi parol verir).

(Bununla yanaşı, bu sual , nəhayət, niyə niyə başa düşmək üçün mənə kömək etdiyinə görə, @kindalldan bir cavab var. Təəssüf ki, bu bir səhv hesab edən bu dublikat kimi qeyd edildi.)

57
29 сент. joechoj tərəfindən verilmiş cavab Sep 29 2016-09-29 07:33 '16 'da 7:33' də 2016-09-29 07:33 'də

M.py ( M.py ) müəyyən şərhlər olduqda, biz əsas hesabat (idxal edilməmiş) kimi başlandıqda M.py i yerinə yetirmək M.py , bu M.py bu bəyanatları (test nümunələri, çap bəyanatları) yerləşdirə bilərik.

Mənim cari olaraq (modul ana kimi __name__ və idxal edilmədikdə), __name__ dəyişən "__main__" üçün təyin edilir və __name__ dəyişən dəyişən dəyər, ən çox modul adı ( 'M' ) olacaq. Müxtəlif modul varyantlarını paylaşarkən və onların xüsusi giriş və çıxış talimatlarını ayırdıqda və test vəziyyətlərinin mövcud olduğu zaman faydalıdır.

Qısacası , " if __name__ == "main" bloğu modul idxal edildikdə başlanğıcın qarşısını almaq üçün istifadə edin.

44
03 апр. Cavab Nabeel Ahmed tərəfindən verilir 03 Apr. 2013-04-03 17:09 '13 at 17:09 2013-04-03 17:09

Cavabla daha mücərrəd bir şəkildə baxaq:

Bu kod x.py'de olduğunu varsayalım:

 ... <Block A> if __name__ == '__main__': <Block B> ... 

A və B blokları xpy işlədikdə başladı.

XY-nin idxal olunduğu və kodu orada açılmış başqa bir modul (məsələn, "y.py") başlayanda yalnız A bloku A (B deyil) başlayır (məsələn, "x" -də "Py" funksiyası y.py-dən çağırıldığında) .

35
20 янв. Alisa yanvar ayına cavab verdi 20 2015-01-20 20:48 '15 at 20:48 2015-01-20 20:48

Sadəcə, __name__ , skriptin əsas modul kimi işləməyəcəyini və ya idxal edilmiş bir modul kimi işlədiyini müəyyən edən hər bir skript üçün müəyyən edilmiş dəyişəndir.

Belə ki, iki ssenarimiz varsa;

 #script1.py print "Script 1 name: {}".format(__name__) 

və həmçinin

 #script2.py import script1 print "Script 2 name: {}".format(__name__) 

1-lərin icrasının nəticəsidir

 Script 1 name: __main__ 

Və script2 icra nəticəsi:

 Script1 name is script1 Script 2 name: __main__ 

Gördüyünüz kimi, __name__ hansı kodun "əsas" modul __name__ bildirir. Bu, sadəcə kod yaza bilərik və C / C ++ kimi struktur problemləri ilə bağlı narahat olmayın, çünki fayl "əsas" funksiyanı yerinə yetirmirsə, bu mümkün deyilsə, bu mümkün deyilsə, bu mümkün deyil kitabxana kimi.

Diyelim ki, böyük bir şey yapan bir Python betiği yazırsınız ve diğer amaçlar üçün faydalı olan bir tekne gemisi uyguluyorsunuz. Onları istifadə etmək istəyirsinizsə, ssenarinizi sadəcə idxal edə və proqramınızı yerinə yetirmədən istifadə edə bilərsiniz ( if __name__ == "__main__": yalnız if __name__ == "__main__": kontekstdə icra olunarsa :. C / C ++ if __name__ == "__main__": bu fraqmentləri ayırmaq lazımdırsa sonra da fayl daxil olan bir modul. Aşağıdakı vəziyyəti təsəvvür edin;

2019

15 окт. Cavab 15 oktyabr redbandit verilir . 2016-10-15 12:07 '16 at 12:07 2016-10-15 12:07

Python'u interaktiv rejimdə __name__ lokal dəyişən __name__ dəyərinə təyin __main__ . Eyni şəkildə, bir Python modulunu komanda satırından başqa bir modulda idxal etmək əvəzinə çalıştırdığınızda, __name__ özniteliği __main__ və faktiki modul adı deyil, təyin olunur. Beləliklə, modullar, özlərinin __name__ dəyərini özləri üçün necə istifadə etdiyini, başqa bir proqramdan və ya komanda xətti ilə çalışan əsas proqramdan dəstək olmasını müəyyən edə bilərlər. Beləliklə, aşağıdakı deyim Python modullarında olduqca yaygındır:

 if __name__ == '__main__': # Do something appropriate here, like calling a # main() function defined elsewhere in this module. main() else: # Do nothing. This module has been imported by another # module that wants to make use of the functions, # classes and other useful bits it has defined. 
32
11 дек. Cavab Zain 11 dekabr verilir. 2013-12-11 14:23 '13 at 14:23 2013-12-11 14:23

Şərhlər:

 if __name__ == "__main__": main() 

Bu __name__ özniteliğinin Python skripti "__main__" olub-olmadığını yoxlayır. Başqa sözlə, əgər proqramın özü icra __main__ , xüsusiyyət __main__ olacaq, buna görə proqram yerinə yetiriləcəkdir (bu halda, main() funksiyası).

Python scriptiniz bir modul tərəfindən istifadə edildikdə, if xaricindəki hər hansı bir kod icra if \__name__ == "\__main__" proqramın bir modul kimi istifadə olunub-yoxlanılmadığını yoxlamaq üçün istifadə olunur və buna görə də kodu

29
22 авг. Cavab Larry tərəfindən 22 Avqustda verildi . 2017-08-22 21:53 '17 at 21:53 2017-08-22 21:53

if __name__ == '__main__' haqqında bir şey izah etməzdən əvvəl if __name__ == '__main__' __name__ nə olduğunu və nə etdiyini anlamaq vacibdir.

__name__ nədir?

__name__ - bu DunderAlias - qlobal dəyişən (modullardan əldə edilə bilən) hesab edilə bilər və global olaraq eyni şəkildə işləyir.

Это строка (глобальная, как упоминалось выше), как указано type(__name__) (дает <class 'str'> ), и является встроенным стандартом для версий Python 3 и Python 2 .

Где:

Его можно использовать не только в скриптах, но также можно найти как в интерпретаторе, так и в модулях/пакетах.

Переводчик:

 >>> print(__name__) __main__ >>> 

Автор сценария:

test_file.py:

 print(__name__) 

Результат в __main__

Модуль или пакет:

somefile.py:

 def somefunction(): print(__name__) 

test_file.py:

 import somefile somefile.somefunction() 

Результат в somefile

Обратите внимание, что при использовании в пакете или модуле __name__ принимает имя файла. Путь фактического пути модуля или пакета не указан, но имеет свой собственный DunderAlias __file__ , который позволяет это.

Вы должны увидеть, что где __name__ , где это основной файл (или программа), всегда будет возвращать __main__ , а если это модуль/пакет или что-то, что запущено с каким-либо другим скриптом Python, вернет имя файла откуда оно возникло.

Практика:

Как переменная означает, что ее значение может быть перезаписано ("can" не означает "should"), переписывание значения __name__ приведет к отсутствию читаемости. Поэтому не делайте этого по любой причине. Если вам нужна переменная, определите новую переменную.

Всегда предполагается, что значение __name__ будет __main__ или имя файла. Повторное изменение этого значения по умолчанию приведет к большей путанице в том, что он добьется успеха, что вызовет проблемы в дальнейшем.

Məsələn:

 >>> __name__ = 'Horrify' # Change default from __main__ >>> if __name__ == 'Horrify': print(__name__) ... >>> else: print('Not Horrify') ... Horrify >>> 

В целом считается хорошей практикой включать в скрипты if __name__ == '__main__' .

Теперь ответьте, if __name__ == '__main__' :

Теперь мы знаем, что поведение __name__ становится понятным:

if это оператор управления потоком, содержащий блок кода, будет выполняться, если заданное значение истинно. Мы видели, что __name__ может принимать либо __main__ либо имя файла, из которого он был импортирован.

Это означает, что если __name__ равно __main__ то файл должен быть основным файлом и должен быть запущен (или это интерпретатор), а не модуль или пакет, импортированные в скрипт.

Если действительно __name__ принимает значение __main__ то все, что находится в этом блоке кода, будет выполняться.

Это говорит нам, что если файл работает, является основным файлом (или вы напрямую работаете с интерпретатором), то это условие должно выполняться. Если это пакет, то он не должен, и значение не будет __main__ .

Модули:

__name__ также может использоваться в модулях для определения имени модуля

Варианты:

Также можно использовать другие, менее распространенные, но полезные вещи с __name__ , некоторые из которых я покажу здесь:

Выполнение только в том случае, если файл является модулем или пакетом:

 if __name__ != '__main__': # Do some useful things 

Выполнение одного условия, если файл является основным, а другой, если это не так:

 if __name__ == '__main__': # Execute something else: # Do some useful things 

Вы также можете использовать его для предоставления исполняемых справочных функций/утилит на пакетах и модулях без детального использования библиотек.

Он также позволяет запускать модули из командной строки в качестве основных сценариев, что также может быть очень полезно.

25
ответ дан Simon 03 апр. '18 в 22:32 2018-04-03 22:32

Это особенность, когда из командной строки вызывается файл Python. Обычно это используется для вызова функции "main()" или для запуска другого соответствующего кода запуска, например, для обработки аргументов командной строки.

Его можно было бы написать несколькими способами. Другой:

 def some_function_for_instance_main(): dosomething() __name__ == '__main__' and some_function_for_instance_main() 

Я не говорю, что вы должны использовать это в производственном коде, но это служит для иллюстрации того, что нет ничего "волшебного" в if __name__ == '__main__' . Это хорошее соглашение для вызова основной функции в файлах Python.

20
ответ дан Prof. Falken 24 янв. '13 в 16:48 2013-01-24 16:48

Я думаю, что лучше всего разбить ответ вслух и простыми словами:

__name__ : Каждый модуль в Python имеет специальный атрибут __name__ . Это встроенная переменная, которая возвращает имя модуля.

__main__ : Как и другие языки программирования, Python тоже имеет точку входа для выполнения, т.е. main. '__main__' - это имя области, в которой выполняется код верхнего уровня. В принципе у вас есть два способа использования модуля Python: запустите его напрямую как скрипт или импортируйте его. Когда модуль запускается как сценарий, его __name__ устанавливается в __main__ .

Таким образом, значение атрибута __name__ устанавливается в __main__ когда модуль запускается в качестве основной программы. В противном случае значение __name__ будет содержать имя модуля.

20
ответ дан Inconnu 30 нояб. '16 в 9:47 2016-11-30 09:47

Существует ряд переменных, которые система (интерпретатор Python) предоставляет исходные файлы (модули). Вы можете получить их значения в любое время, поэтому, давайте сосредоточимся на __ name __ переменной/атрибуте:

Когда Python загружает файл исходного кода, он выполняет весь найденный в нем код. (Обратите внимание, что он не вызывает все методы и функции, определенные в файле, но определяет их.)

Прежде чем интерпретатор выполнит файл исходного кода, он определяет несколько специальных переменных для этого файла; __ name __ - одна из тех специальных переменных, которые Python автоматически определяет для каждого файла исходного кода.

Если Python загружает этот файл исходного кода в качестве основной программы (т.е. файл, который вы запускаете), тогда он устанавливает специальную переменную __ name __ для этого файла, имеющую значение "__ main__" .

Если это импортируется из другого модуля, __ name __ будет установлено это имя модуля.

Итак, в вашем примере отчасти:

 if __name__ == "__main__": lock = thread.allocate_lock() thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock)) thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock)) 

означает, что блок кода:

 lock = thread.allocate_lock() thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock)) thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock)) 

будет выполняться только при непосредственном запуске модуля; блок кода не будет выполняться, если другой модуль вызывает/импортирует его, потому что значение __ name __ не будет равно " main " в этом конкретном экземпляре.

Bu kömək edir.

19
ответ дан codewizard 25 нояб. '15 в 15:26 2015-11-25 15:26

if __name__ == "__main__": это в основном среда сценария верхнего уровня, и он указывает интерпретатор, который ("Я выполняю первый приоритет первым").

'__main__' - это имя области, в которой выполняется код верхнего уровня. Модули __name__ устанавливаются равными '__main__' при чтении со стандартного ввода, сценария или из интерактивного приглашения.

 if __name__ == "__main__": # Execute only if run as a script main() 
17
ответ дан The Gr8 Adakron 24 апр. '16 в 11:23 2016-04-24 11:23

Причина для

 if __name__ == "__main__": main() 

прежде всего, чтобы избежать проблем с блокировкой импорта , которые возникли бы из- за прямого импорта кода . Вы хотите, чтобы main() запускался, если ваш файл был вызван напрямую (это случай __name__ == "__main__" ), но если ваш код был импортирован, импортер должен ввести ваш код из основного модуля, чтобы избежать проблем с блокировкой импорта.

Побочным эффектом является то, что вы автоматически включаетесь в методологию, которая поддерживает несколько точек входа. Вы можете запустить свою программу, используя main() в качестве точки входа, но вам этого не нужно. Хотя setup.py ожидает main() , другие инструменты используют альтернативные точки входа. Например, чтобы запустить файл как процесс gunicorn , вы определяете функцию app() вместо main() . Как и в случае с setup.py , gunicorn импортирует ваш код, поэтому вы не хотите, чтобы он делал что-либо во время его импорта (из-за проблемы с блокировкой импорта).

13
ответ дан personal_cloud 22 сент. '17 в 21:32 2017-09-22 21:32

Вы можете сделать файл полезным как script , а также импортируемый модуль .

fibo.py(модуль с именем fibo )

 # Other modules can IMPORT this MODULE to use the function fib def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() # This allows the file to be used as a SCRIPT if __name__ == "__main__": import sys fib(int(sys.argv[1])) 

Ссылка: https://docs.python.org/3.5/tutorial/modules.html

11
ответ дан sam 14 марта '17 в 0:44 2017-03-14 00:44

Я читал так много @ на этой странице. Я бы сказал, если вы знаете это, вы наверняка поймете эти ответы, иначе вы все еще смущены.

Короче говоря, вам нужно знать несколько моментов:

  1. import a действия фактически запускает все, что можно запустить в "a"

  2. Из-за пункта 1 вам может не потребоваться, чтобы все было запущено в "a" при импорте

  3. Чтобы решить проблему в пункте 2, python позволяет вам поставить проверку состояния

  4. __name__ - неявная переменная во всех.py-модулях; когда a.py импортируется, значение __name__ модуля a.py устанавливается в его имя файла "a"; когда a.py запускается напрямую с помощью "python a.py", что означает, что a.py является точкой входа, тогда значение __name__ модуля a.py устанавливается в строку __main__

  5. На основе механизма, как питон устанавливает переменную __name__ для каждого модуля, знаете ли вы, как достичь точки 3? Ответ довольно прост, не так ли? Положите условие if: if __name__ == "__main__":... ; вы можете даже поставить if __name__ == "a" зависимости от вашей функциональной потребности

Важной вещью, что питон особенным в точке 4! Остальное - просто базовая логика.

10
ответ дан jack 24 июня '18 в 18:48 2018-06-24 18:48

Рассматривать:

 print __name__ 

Вывод для выше - __main__ .

 if __name == "__main__": print "direct method" 

Вышеприведенное утверждение верно и печатает "прямой метод". Предположим, если они импортировали этот класс в другой класс, он не печатает "прямой метод", потому что, импортируя, он будет устанавливать __name__ equal to "firstmodel name" .

9
ответ дан Janarthanan Ramu 22 июня '16 в 13:47 2016-06-22 13:47

Если этот.py файл импортируется другими.py файлами, код под "оператором if" не будет выполнен.

Если этот.py запущен python this_py.py под оболочкой или дважды щелкнут в Windows. будет выполнен код под "оператором if".

Обычно он предназначен для тестирования.

5
ответ дан pah8J 19 июня '18 в 14:44 2018-06-19 14:44

Все ответы в значительной степени объясняют функциональность. Но я приведу один пример его использования, который может помочь в дальнейшем очистить концепцию.

Предположим, что у вас есть два файла Python, a.py и b.py. Теперь, a.py импортирует b.py. Мы запускаем файл a.py, где сначала выполняется код "import b.py". Перед тем как остальная часть кода a.py запускается, код в файле b.py должен выполняться полностью.

В коде b.py есть некоторый код, который является исключительным для этого файла b.py, и мы не хотим, чтобы какой-либо другой файл (кроме файла b.py), который импортировал файл b.py, запускал его.

Так вот эта строка проверки кода. Если это основной файл (т.е. B.py), запускающий код, который в этом случае не является (a.py является основным файлом), тогда выполняется только код.

3
ответ дан preetika mondal 04 мая '18 в 11:25 2018-05-04 11:25

Создайте файл, a.py :

 print(__name__) # It will print out __main__ 

__name__ всегда равно __main__ всякий раз, когда этот файл запускается напрямую, показывая, что это основной файл.

Создайте другой файл, b.py , в том же каталоге:

 import a # Prints a 

Запустить его. Он будет печатать, то есть имя файла, который импортируется.

Итак, чтобы показать два разных поведения одного и того же файла , это обычно используемый трюк:

 # Code to be run when imported into another python file if __name__ == '__main__': # Code to be run only when run directly 
3
ответ дан TheVishal 08 янв. '18 в 18:24 2018-01-08 18:24

Этот ответ предназначен для Java-программистов, изучающих Python. Каждый файл Java обычно содержит один открытый класс. Вы можете использовать этот класс двумя способами:

  1. Вызовите класс из других файлов. Вам просто нужно импортировать его в вызывающую программу.

  2. Запустите класс отдельно для тестирования.

В последнем случае класс должен содержать общедоступный метод static void main(). В Python этой цели служит глобально определенная метка '__main__' .

2
ответ дан Raja 07 окт. '18 в 7:52 2018-10-07 07:52

если имя == ' main ':

Мы видим, что __name__ == '__main__': довольно часто.

Он проверяет, импортирован ли модуль или нет.

Другими словами, код внутри блока if будет выполняться только при прямом запуске кода. Здесь directly означает not imported .

Посмотрите, что он делает, используя простой код, который печатает имя модуля:

 # test.py def test(): print('test module name=%s' %(__name__)) if __name__ == '__main__': print('call test()') test() 

Если мы запускаем код напрямую через python test.py , имя модуля __main__ :

 call test() test module name=__main__ 
2
04 апр. Ali Hallaji tərəfindən verilmiş cavab 04 Apr '18 в 17:32 2018-04-04 17:32

Недавно я столкнулся с этим, создав класс в python (глубокое обучение) и, насколько мне известно, и в соответствии с вышеприведенными пояснениями выше, я разработаю

__name__=="__main__"

Поскольку иногда мы строим класс в.py файле и определяем много функций внутри этого класса. но мы не хотим обрабатывать все эти функции класса для одной цели. например, для создания класса и определения некоторых функций для создания данных (файлы.npy), а некоторые для загрузки данных. поэтому, если мы определим

__name__=="__main__"

ххх = имя_класса()

xxx.create_data()

Значит, если мы будем называть.py файл, тогда он будет создавать только данные и не будет обрабатывать другие функции класса. другие функции класса (загрузка данных) также могут быть импортированы другими классами.

0
ответ дан Khan 12 окт. '18 в 15:06 2018-10-12 15:06

Что означает имя if: " main ": do?

Контур:

1, как исполняемый скрипт, работать для себя как самостоятельно занятый: он выполняет коды в модуле, если он запускается непосредственно как "python foo.py",
2, как импортированный модуль для работы для других:
Его коды могут быть повторно использованы безопасно, если они импортированы в другой модуль как "import foo",

-1
ответ дан JawSaw 20 авг. '18 в 3:49 2018-08-20 03:49

Если интерпретатор python запускает этот модуль (исходный файл) в качестве основной программы, он устанавливает для переменной специального имени значение " main ".

Если этот файл импортируется из другого модуля, имя будет установлено на имя модуля. Название модулей доступен в качестве значения назвать глобальной переменной.

-1
ответ дан Kiran Sk 11 авг. '18 в 8:21 2018-08-11 08:21

_ name _ == _ main _ будет убедиться, что код/​​операторы, присутствующие внутри этого блока, будут выполняться только при непосредственном выполнении этого файла, вместо этого, если мы импортируем это как модуль в другой файл python, тогда мы можем вызвать функцию, определенную в нем а также блок, который присутствует внутри _ name == main _, не будет выполнен.

-1
ответ дан Ravichandran K 28 июня '18 в 13:19 2018-06-28 13:19

Другие вопросы по меткам или Задайте вопрос