0

在一些 Python 脚本中,我看到以下导入:

import fileA
import someDir.fileB
from fileC import functionA

有对应的文件fileA.pysomeDir/fileB.pyfileC.py。但是,在查看请求源代码时,我在__init__.py文件中找到了这个:

from requests.packages.urllib3.contrib import pyopenssl

在这种情况下,requests是 CWD 并且packages.urllib3.contrib.pyopenssl.py是文件。为什么这违反惯例?我确实看到该packages.urllib3.contrib目录也有一个__init__.py文件,这似乎是相关的。

此外,我不确定它是否相关,但我认为是相关的,所以我将其发布在这里。在我的脚本中,我有文件夹kennethreitz/requests,因为应用程序依赖于 Requests 模块,但我将它部署到可能没有安装 Requests 的环境中。但是,简单地添加到文件import kennethreitz.requests中并不包括 Requests 模块。我import kennethreitz.requests.__init__和其他一些明显的排列,但我无法导入模块。如何使用我的代码打包请求?明显的谷歌搜索没有帮助。

4

1 回答 1

2

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

相反,将kennethreitz目录(不应该文件__init__.py)添加到您的sys.path模块搜索路径中。这样,requests模块仍然可以作为顶级包导入。

接下来,您可能想要查看 Python 打包、依赖项并使用类似pipzc.buildout为您部署代码的工具。这些工具会为您处理依赖项并将requests根据需要进行安装。有关介绍,请参阅Python 打包用户指南

于 2013-07-10T09:48:13.927 回答