2017-04-10 41 views
2

我正在使用PyDev在python3中創建一個包。我的一個.py文件有一個簡單的相對導入,from . import filename。當我使用另一個文件包外,從包中導入並測試了該文件,它工作正常,但在運行該文件直接PyDev的失敗,此錯誤:Python中的__name__,Pydev

ImportError: attempted relative import with no known parent package 

很多搜​​索後,我發現一些代碼,當我在任何進口之前添加它時,工作:

__path__ = [""] # indicates local directory 
__package__ = ["package_name"] 

然後一切運行良好。然而,只是一個測試,在該文件中我把這一行:print(__name__)

輸出是兩個字符串!

package_name 
__main__ 

我懷疑這是隻是因爲它是在一個包,並直接運行,但後來我怎麼做這樣的事情if __name__ == "__main__":

這裏有一些更多的輸出,當我搞砸與周圍的__name__ VAR更多:

print(repr(__name__)) 
# output 
'package_name' 
'__main__' 

print(__name__.endswith("__main__")) 
# output 
False 
True 

print(type(__name__)) 
# output 
<class 'str'> 
<class 'str'> 

我甚至不明白一個變量如何能夠分配給它的兩個獨立的字符串。到底是怎麼回事?

+0

這聽起來像這個文件實際上運行兩次。有幾種方法可能會讓進口系統混淆足以發生這種情況。 – user2357112

+0

到目前爲止,最簡單的解決方案就是不嘗試直接運行軟件包內容,但不嘗試將同一文件製作爲可導入的模塊和腳本。 – user2357112

+0

@ user2357112它運行兩次很有意義,關於如何發生的任何想法?爲了迴應您的其他評論,我認爲這就是我現在要做的。這個文件並不是真的需要成爲一個可運行的腳本,我只是感興趣的是它不會在運行時產生錯誤。謝謝您的幫助! – Cole128

回答

0

這是一個已知的Python問題......文件運行爲__main__不能對他們有相對的進口,除非他們與-m標誌(其中進口模塊與給定的名稱來運行,然後改變其__name__運行它作爲__main__

默認情況下只的PyDev定期運行該文件,但你也可以問它通過它的計算模塊名稱來運行該文件(見preferences > PyDev > Run > Launch modules with "python -m mod.name")。

就個人而言,我建議你不要把相對進口在你的__main__模塊中(因爲那時用戶將不能運行你的模塊python filename.py,並且還必須使用-m標誌運行),但如果這對您來說沒問題,則可以在PyDev中啓用該選項。

+0

我已經在pydev中啓用了該功能。這也不是一個旨在作爲'__main__'運行的文件,我只是想能夠無誤地運行它。如果沒有簡單的解決方法,我將按照我的意願將它用作模塊,就像@ user2357112建議的那樣。 – Cole128