2012-04-26 28 views
6

我剛剛碰到鼻子不會運行標記爲可執行的測試的行爲(如a previous question中所述)。我發現這令人驚訝,我浪費了一些時間試圖找出爲什麼鼻子沒有運行我的測試,然後才知道鼻子在這裏的行爲。在Python中「導入安全」是什麼意思?

在聯機幫助頁nosetests,它描述了一個選項,以覆蓋缺省行爲:

--exe    Look for tests in python modules that are executable. 
        Normal behavior is to exclude executable modules, 
        since they may not be import-safe [NOSE_INCLUDE_EXE] 

我的問題是:什麼是「進口安全」呢?什麼是非導入安全模塊的例子?並且可以通過刪除可執行位來使非導入安全的模塊成爲導入安全的,或者除此之外還有更多嗎?

回答

5

我並不熟悉鼻子,但我很確定「進口安全」是什麼意思,導入模塊只是定義的東西,而不是去運行的東西。

想法是,如果一個.py文件被設計爲作爲腳本執行,那麼它的功能將在執行模塊範圍代碼時啓動。這可以防止導入__name__ == '__main__'技巧,但它可能不會。如果不是,那麼在不使用參數的情況下調用它時,導入它可能會做同樣的事情,在某些情況下這可能會導致錯誤。

因此,您可以明確地告訴鼻子,通過傳遞--exe標誌,沒有可能導致危險的可執行腳本,或者您可以清除腳本中的可執行權限。

4

它指的是既可以導入也可以作爲腳本執行的模塊。這通常是通過下面的代碼完成:

if __name__ == "__main__": 
    print "running as script" 

如果本來是可執行文件不具有此檢查,進口將立即執行,這將可能有有害的副作用或異常凸起末端的腳本。

5

「導入安全」沒有特定的定義含義。在這種情況下,重點在於Python模塊在導入時可以執行某些操作(請記住,導入模塊意味着執行它並將所有內容保存在其名稱空間中)。

如果模塊被標記爲可執行位,nose認爲是這種情況 - 並且由於您可能不希望每次運行測試時都會發生這種情況,所以它將跳過該模塊。

+0

@NiklasB。對不起,我不明白你的問題。什麼是'它'? – katrielalex 2012-04-26 09:31:31

+0

沒關係。我指的是「鼻子」,但根據錯誤信息,它只是檢查執行位。 – 2012-04-26 09:32:08