2012-09-18 92 views
1

導入自定義Python包,我創建了一個名爲「custom_module」文件夾,我有一個包含文件夾內的__init__.py:如何通過名稱

__all__ = [ 
     'Submodule1', 
     'Submodule2' 
] 

從我讀什麼文件,我應該能夠請致電import custom_module並獲得該軟件包的訪問權限,但這不會發生。我如何讓python識別我的包?我正在使用python 3.2

更新: 該軟件包不在python文件夾中。 Python環境如何找到它,所以我可以通過名稱成功導入它。

+0

是'custom_module'可在'PYTHONPATH'? – mgilson

+0

@mgilson唔,請解釋。 –

回答

5

sys.path包含Python搜索路徑。試圖import您的模塊和包之前,將其設置爲包含您的路徑:

import sys 
sys.path.insert(0, 'your_path_here') 
import custom_module 

更詳細的Python docs並在此question

+0

在這種情況下,如果我爲我的軟件包製作安裝程序包,我應該在python目錄中解壓縮它,或者我可以讓安裝程序用用戶選擇的目錄修改sys.path? –

+0

sys.path修改僅對您當前的runnig腳本有效。如果您想將您的軟件包永久安裝到給定的Python安裝中,我推薦閱讀[關於標準安裝過程的官方文檔](http://docs.python.org/py3k/install/index.html#standard-build-和安裝)。通常安裝程序會在您的軟件包中調用一個'setup.py'並將您的代碼放入標準位置。您可能想要遵循這些標準,以便您的模塊可以在http://pypi.python.org上發佈。 [Pypi文檔](http://wiki.python。org/moin/CheeseShopTutorial) – cfi

+1

一般來說,不要告訴Python看起來非標準的地方,而應該將你的軟件包安裝到某個標準的地方。 – katrielalex

4

有兩個截然不同的概念你是迷惑:模塊

A 模塊是你想象的那樣:一個包含類,變量等的Python腳本。您可以通過文件名導入它,然後可以訪問其名稱空間中的變量。

A 是在一個文件夾內組合在一起的模塊的集合。如果該文件夾包含一個名爲__init__.py的文件,Python將允許您將整個文件夾導入,就好像它是一個模塊一樣。這將運行__init__中的代碼,但不一定會導入文件夾中的所有模塊。 (這是一個經過深思熟慮的設計選擇:套餐往往是非常大的,和進口所有模塊可能需要花費很長的時間。)

其默認出口(如package.thing)唯一的東西在裏面__init__定義的變量。如果要submodulepackage.submodule的形式提供,則需要將其導入__init__

__all__是一個相關的概念。簡而言之,它定義了當您執行from package import *時導入的內容,因爲對於Python來說,計算出其他內容並不容易。你通常不需要它。

+0

我明白這一切(抱歉,它不是一個模塊)。然而,我如何讓Python找到我的包,因爲當我說導入custom_module什麼都不會發生。我的軟件包不在python文件夾中。 –