2016-05-29 88 views
0

我正在創建一個Python模塊mymodule.py,我需要在導入時運行一個函數。該功能不應該由用戶運行,只需要正確啓動模塊。Python模塊中是否有C的main()等價物?

因爲它是一個模塊,這是不行的:

if __name__ == '__main__': 
    _main() 

我想跟進PEPs和我只是想知道如果有C'S main()的一個Python模塊中的等價?

...或者如果我應該只是寫入初始化代碼(不作爲函數),或者內聯調用函數。

+0

爲什麼不編寫內聯代碼片段,因爲內聯代碼片段將在導入時處理? – gevorg

+0

調用它時出現了什麼問題*不管if __name__ =='__main __''是什麼?那不是PEP友好的?它在某些情況下沒有做到你想要的嗎? –

+2

「在導入時運行函數」和C的main()不等效。 –

回答

4

不縮進功能的代碼將在文件加載(一次)時運行。這可能是你想要什麼:

def some_function(): 
    pass 


def other_function(): 
    pass 

init_value = 0 # This code here is run immediately. 
buffer = None 
+1

是的,但那些變量將暴露在模塊'dir(mymodule)'中。我真的不想要那樣。 – fredrik

+0

然後將代碼放在'_main'函數中(以避免泄漏變量)並從模塊的頂層調用它。 –

+3

在這種情況下,您可以定義函數並將其內聯。 – gevorg

0

呀有這樣一個頂級功能就像是一個主要的,是這樣的:

def interact(): 
     # Your code which handles all the rest of the functions 
     # For example 
     print('Welcome to this program!') 
     filename = input('Please enter the data source file: ') 
     load_data(filename) 
     ...... 

然後在腳本的底部,你在做什麼:

if __name__ == '__main__': 
     interact() 
如果要導入其他文件到程序,如 mymodule.py

,只是這樣做:

from mymodule import * 

或者,你可以測試函數出這樣的:

if __name__ == "__main__": 
     print test_the_function(123, 456) 

mymodule是進口的,代碼像以前一樣運行,但是,當我們得到的if語句,巨蟒看起來看到什麼名字模塊有。由於模塊是導入的,我們通過導入它時使用的名稱知道它,所以__name__mymodule。因此,打印語句永遠不會到達。

python的美麗之處在於它不像Cs main()那樣工作。你剛剛開始輸入,並且你已經編寫了你的​​第一個程序。 Python的簡單性使它變得如此美麗,我不會試圖與C進行比較,它不會起作用。

您還可以檢查這個網站了,如果有關於蟒蛇主(一些有用的信息):

https://wiki.python.org/moin/Asking%20for%20Help/Do%20you%20need%20a%20int%20main()%20like%20you%20do%20in%20c%2B%2B

+0

是的,但OP希望即使在導入時也能調用該函數。我們導入模塊時這不起作用。 – formatkaka

+0

是的,如果沒有看到OP的代碼,很難知道問題是什麼。 – RoadRunner

+0

認真,冷靜,你們是無情的。 – RoadRunner

1

運行在進口功能並不等同於C'S main()。 C的main()在執行程序時運行。

當導入模塊時,會執行頂級(即不在函數中)的Python模塊中的所有內容。例如,如果這是你的模塊內容:

def _on_import(): 
    pass # do something 
_on_import() 

然後_on_import()導入模塊時執行。

當你的模塊看起來是這樣的:

def main(): 
    pass # do something 
if __name__ == '__main__': 
    main() 

然後main()運行Python模塊作爲腳本執行時(例如,如果你的模塊文件foo.py和運行python foo.py)。這基本上相當於C的main()

相關問題