2013-07-10 162 views
0

在一些Python腳本我看到下面的進口:Python模塊路徑

import fileA 
import someDir.fileB 
from fileC import functionA 

存在着相應的文件fileA.pysomeDir/fileB.pyfileC.py。然而,雖然看在Requests源代碼,我發現這個在__init__.py文件:

from requests.packages.urllib3.contrib import pyopenssl 

在這種情況下,requests是CWD和packages.urllib3.contrib.pyopenssl.py是文件。爲什麼這個違反慣例?我確實看到packages.urllib3.contrib目錄也有一個__init__.py文件,其中seems to be related

此外,我不確定它是否相關,但我認爲這是我在這裏發佈。在我的腳本中,我有文件夾kennethreitz/requests,因爲應用程序依賴於請求模塊,但是我將它部署到可能沒有安裝請求的環境。但是,僅僅添加到文件import kennethreitz.requests不包括請求模塊。我import kennethreitz.requests.__init__和其他一些明顯的排列,但我不能讓模塊導入。 如何使用我的代碼打包請求?明顯的Google searches沒有幫助。

回答

1

requests正在使用絕對導入。你不能任意地將軟件包嵌套到其他目錄中,並且仍然希望能夠運行。

相反,添加kennethreitz目錄(這應該__init__.py文件)到您的sys.path模塊搜索路徑。這樣requests模塊仍然可以作爲頂級包導入。

接下來,您可能需要查看Python打包和依賴關係,並使用諸如pipzc.buildout之類的工具爲您部署代碼。這些工具爲您處理相關性,並將根據需要安裝requests。有關介紹,請參閱Python Packaging User Guide