2016-04-22 50 views
0

我有一個腳本foo.py,它試圖from bar import baz:基本層次如下:陰影網站模塊,通過我自己的模塊在Python

/ 
    foo.py 
    bar/ 
     __init__.py 
     baz.py 

的問題是,該系統的船舶自身bar版本在site-packages,我想避免導入(我想確保我使用的是我發佈的模塊,而不是系統上的任何版本)。

最初我以爲sys.path中的路徑順序就足以解決這個問題。但是,在某些系統上,site-packages中有一個bar.pth文件,該文件將bar添加到sys.modules,導致bar僅導入site-packages版本時導致完全忽略sys.path

如何確保我導入bar的本地版本,而不管系統上可能設置了什麼?

+1

只需重命名'bar'。隱藏像這樣的內置模塊是一個可怕的想法。它不會影響你自己的代碼,就像遮蔽'list';它會影響整個程序中的所有代碼。 – user2357112

+1

這不是內置模塊,這是site-packages中的一個模塊。我無法重命名吧 - 它與系統模塊相同,只是可能不同的版本。 – xyzzyz

回答

0

根據documentation,如果您定義了一個環境變量,PYTHONPATH,其中包含文件夾bar,它將首先嚐試,因此它將導入您的模塊。

+0

這沒有幫助 - 如果'bar.pth'將模塊添加到'sys.modules'中,它在嘗試導入'bar.baz'時甚至不會搜索導入路徑,因爲它會先找到'bar ''在'sys.modules'中,並使用'bar .__ path__'來導入'bar.baz' – xyzzyz

+0

我明白了,你是否試過簡單地從'sys.modules'中刪除這個模塊?例如。 del sys.modules ['bar'],然後在搜索路徑中導入自己的優先權?儘管在我看來這是一種強烈的「代碼味道」:應該單獨放置內置模塊。 – Cyb3rFly3r

+0

從sys.modules中刪除模塊可能會有幫助,但我想要一個更強大的方法來處理所有可能的Python導入系統的怪癖(例如sys.meta_path等)。 – xyzzyz