在某些Python脚本中,我看到以下导入:
import fileA
import someDir.fileB
from fileC import functionA
存在相应的文件fileA.py
,someDir/fileB.py
和fileC.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没有帮助。
答案 0 :(得分:2)
requests
正在使用绝对导入。你不能随意将包嵌套到其他目录中,并且仍然期望能够正常工作。
相反,请将kennethreitz
目录(不具有__init__.py
文件)添加到sys.path
模块搜索路径中。这样,requests
模块仍可作为顶级包导入。
接下来,您可能需要查看Python打包,依赖关系并使用pip
或zc.buildout
等工具为您部署代码。这些工具为您处理依赖项,并根据需要安装requests
。有关简介,请参阅Python Packaging User Guide。