2011-06-11 111 views
1

導入的庫考慮到這一行的Python代碼的文件位置:我如何獲得通過的Python

import foo 

我怎麼那麼對包含在要執行的源代碼文件的磁盤找到位置FOO?

(我Win7上)

回答

4

你可以找到信息

foo.__file__ 

注意,不是所有的模塊都來自文件,雖然。一些模塊也直接編譯到解釋器中,這些模塊將不具有__file__屬性。

解釋器中包含的模塊列表可在sys.builtin_module_names中找到。

+0

還有一些是從C編譯的,不會直接提供源代碼。 – 2011-06-11 00:32:53

+0

謝謝Sven。但是Python告訴我,我導入的模塊沒有__ file __屬性(爲防止默認的__bold__行爲而添加了空格),而且它絕對不是在解釋器中編譯的。我試圖區分安裝在python中的活塞0.2.2和我在django項目位置複製的活塞源代碼的單獨分支。 – Trindaz 2011-06-11 00:54:07

+1

實際上,所有未編譯到解釋器中的模塊都應具有'__file__'屬性,無論它們是C擴展名還是從'.pyc'文件或其他任何文件加載。你使用的是什麼版本的Python?無論如何,您還可以嘗試使用'imp.find_module()'來找出Python將要導入的文件。 – 2011-06-11 01:10:54

0

當模塊沒有與文件系統中的文件進行一對一映射時,我不確定__file__的值。特別是,如果它正在加載在ZIP文件中找到的模塊,我不確定__file__的樣子。 (當我需要這樣的映射時,我使用了元組(「path/to/file.zip」,「path/within/zip/module.pyc」),但這是手動執行sys.path的結果。 )如果它將__file__設置爲None,我不會感到驚訝。

當它是一個關於同一個名稱的模塊將被加載的問題時,它總是第一個在sys.path上找到的。

在您首次導入軟件包以手動調整內容之前,可能需要sys.path.insert(0, some_dir)。 (在環境中,設置爲PYTHONPATH。)

理想情況下,只需通過檢查PYTHONPATH和/或sys.path即可找出正在使用哪個。如果加載的是錯誤的,修復它的唯一方法是使用PYTHONPATHsys.path