我不断收到ImportError:lib模块中没有名为twitter的模块
细节:
twitter模块位于lib目录中。
lib目录中有一个空的init.py
我在目录外的页面上收到错误
当我从lib目录中取出twitter模块并说import twitter时,它起作用了
当我将twitter模块放回lib内部并从lib import twitter中说时,或者当我说import twitter时,或者说import lib.twitter时,转到****并喜欢它
我尝试这样做:https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en,它建议:
要告诉您的应用程序如何在此目录中查找库,请在项目的根目录中创建(或修改)名为appengine_config.py的文件,然后添加以下行:
from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')
然后尝试导入twitter,然后从lib import twitter尝试,它说:“哈哈,不错的尝试。”
怎么办?
请您参考如下方法:
tl; dr-评论正确。 “ lib”不是模块,而是包含模块的文件夹。它必须在使用import twitter的vendor.add('lib')之前位于Python导入路径上,这在部署或使用dev_appserver.py时应正确设置导入路径。如果将vendor.add(lib)片段放在appengine_config.py文件中并运行dev_appserver.py或deploy,并且twitter模块位于lib内,则应该能够import twitter。如果您在App Engine / devappserver之外运行,则需要确保lib在PYTHONPATH上。
这是lib文件夹的详细说明;什么是供应商;以及它们如何适应管理App Engine依赖性的全局。
使用App Engine,您可以在app.yaml中指定沙箱提供的一些依赖项。您可以找到可用库列表here。对于任何其他依赖项(只能是纯Python库),这些库需要直接包含在项目中。通常将这些依赖项的代码直接包含在项目中(而不仅仅是将它们列出在requirements.txt中,并期望它们在部署时安装)通常被称为“供应商”。
现在,即使我们直接包含依赖项,我们还是只想使用pip和requirements.txt,出于以下几个原因。但是pip通常用于安装到系统库或virtualenv中的库中,而不是安装到项目本身中。因此,向pip添加了功能,并向App Engine添加了功能以解决此问题。
pip功能将依赖项安装到文件夹中,而不是系统库或virtualenv中。您可以使用-t标志,如下所示:
pip install -r requirements.txt -t lib
其中“ lib”是要安装到的文件夹。这样,您仍然可以在requirements.txt中指定依赖项,并使用pip进行安装,它们将直接安装到指定的目录中。正如评论所指出的,lib文件夹本身不是模块-它仅包含它们。因此,您的lib文件夹不应包含
__init__.py,而应仅包含确实具有
__init__.py的文件夹“ twitter”。由于
lib不是模块,因此
from lib import twitter实际上没有任何意义。还要注意,
lib是一个任意名称,但是我们通常按照惯例选择该名称。
使用pip进行销售有一些很大的优势,而不仅仅是手动下载依赖项并将它们添加到项目中。优点之一是您不需要将依赖项检查到源代码控制中-只需添加requirements.txt,并告诉其他用户也使用
pip -t命令来提供依赖项。另一个优点是,它组织得更好,可以将您的代码与第三方模块完全分开。供应商功能的重点是在保持这些优势的同时仍要遵循App Engine的要求,在部署时将依赖项包括在目录中。
您正在使用的App Engine供应商扩展用于识别文件夹包含已“供应”的模块并将其添加到路径中。那就是您在代码段中使用的供应商扩展。确保
lib文件夹位于导入路径上,以便可以将安装的模块导入其中。
一旦运行了vendor.add命令,您应该能够将模块导入lib文件夹中。如注释所述,您需要确保它在
import twitter之前运行。一个好的做法是确保那些供应商命令先运行。您可以通过将代码放在目录中名为
appengine_config.py的文件中来完成此操作。这是一个特殊的文件,可以在其他任何文件之前运行。看一下执行
here的示例。
最后的一些注释可能会有所帮助:
appengine_config.py将在GAE环境中运行,或者在您运行模拟GAE环境的dev_appserver时运行。但是,如果您在GAE环境之外运行,请确保您的PYTHONPATH包括要从中导入的
lib文件夹。
由于您可以使用pip供应商库,因此您可能会问为什么要使用app.yaml包含依赖项?答案是,由于只能销售纯Python库,因此对于需要C库的任何库(例如MySQL),仍应使用app.yaml依赖项。
如果您提供了供应商的库和app.yaml库,则您不希望供应商将位于GAE沙箱中的库,因为版本可能会发生冲突。在这种情况下,最好为要供应的依赖项提供一个单独的requirements.txt,并且仅在本地运行时才要包含的依赖项,而GAE将在沙箱中提供这些依赖项。 Here是MySQL的一个示例。
