Python模块的路径

时间:2013-07-10 09:38:19

标签: python module package

在某些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,因为应用程序依赖于Requests模块,但我将其部署到可能没有安装Requests的环境中。但是,仅添加到文件import kennethreitz.requests不包括“请求”模块。我import kennethreitz.requests.__init__和其他一些明显的排列,但我无法导入模块。 如何使用我的代码打包请求?显而易见的Google searches没有帮助。

1 个答案:

答案 0 :(得分:2)

requests正在使用绝对导入。你不能随意将包嵌套到其他目录中,并且仍然期望能够正常工作。

相反,请将kennethreitz目录(具有__init__.py文件)添加到sys.path模块搜索路径中。这样,requests模块仍可作为顶级包导入。

接下来,您可能需要查看Python打包,依赖关系并使用pipzc.buildout等工具为您部署代码。这些工具为您处理依赖项,并根据需要安装requests。有关简介,请参阅Python Packaging User Guide