2011-12-01 41 views
8

讀取所有以下後,我找不到答案:如何知道python腳本是否使用解釋器的-m選項運行?

理由:
當使用相對進口的測試腳本正在運行,沒有-m選項我可以打印警告消息,而不是將標準回溯導致ValueError: Attempted relative import in non-package異常。不知道這個我可以趕上這個例外,只有建議缺少-m選項可能是錯誤的原因。

+1

你需要什麼?你可以舉一些例子或測試用例,這種需求變得明顯嗎? – jsalonen

回答

2

另一種看法是,__package__設置爲當使用-m(當模塊未包含在任何軟件包中時使用空字符串,因此它仍不同於None)時,直接執行該腳本並返回到軟件包名稱時爲。

+1

不錯! [PEP 366主要模塊顯式相對導入](http://www.python.org/dev/peps/pep-0366/)不僅是觀察,而且是**授權**。 –

3

聲明:這只是一個觀察,我沒有在文檔中看到它,所以它可能與實現有關,並且可能在不同的Python版本中不一致。

我注意到,調用使用-m選項叫做__loader__變量被添加到命名空間,所以在你的腳本的頂部的腳本時,你可以檢查該變量的存在:

if '__loader__' in globals(): 
    # called with -m 

對於一些額外的安全,你可以檢查,看看是否__loader__pkgutil.ImpLoader一個實例:

if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader': 
+0

這個**在'runpy'模塊的文檔中是**; *在執行模塊代碼之前,在全局變量字典中設置特殊全局變量'__name__','__file__','__loader__'和'__package__'(注意,這是一組最小變量 - 其他變量可以隱式設置爲一個解釋器實現細節)*然而'__loader__'是一種通用的,我們永遠不知道還有什麼可能設置它... –

+1

+1這是一個完全合理的解決方案。 –

+0

@RaymondHettinger是否有任何理由在這種情況下沒有真正的**獨特**全局變量集? –

相關問題