我一直得到ImportError:在我的lib模块中没有名为twitter的模块
详细说明:
告诉您的应用如何在此目录中查找库,在项目的根目录中创建(或修改)名为appengine_config.py的文件,然后添加以下行:
from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')
然后尝试导入twitter,并尝试从lib import twitter,它说,"哈哈,很好的尝试。"
现在是什么?
答案 0 :(得分:9)
tl; dr - 评论是对的。 'lib'不是模块,它是包含模块的文件夹。它需要在您的import twitter
之前使用vendor.add('lib')
在您的Python导入路径上,使用vendor.add(lib)
,这应该在部署或使用dev_appserver.py时正确设置导入路径。如果您将appengine_config.py
代码段放在lib
文件中并运行dev_appserver.py或deploy,并且twitter模块位于import twitter
内,则您应该能够lib
。如果您在App Engine / devappserver之外运行,则需要确保PYTHONPATH上有lib
。
以下是pip install -r requirements.txt -t lib
文件夹的更长解释;是什么东西;以及它们如何适应管理App Engine依赖关系的大局。
使用App Engine,您可以在app.yaml中指定沙箱提供的一些依赖项。您可以查看可用库列表here。对于任何其他依赖项(只能是纯Python库),库需要直接包含在项目中。直接将这些依赖项的代码作为项目的一部分包含在内(而不是仅将它们列在requirements.txt中并期望它们在部署时安装)通常称为“vendoring”。
现在,即使我们直接包含依赖项,我们也只是使用pip和requirements.txt,我将在下面提到几个原因。但是pip通常用于将库安装到系统库或virtualenv中,而不是安装到项目本身。因此,pip中添加了一项功能,并在App Engine中添加了一项功能来解决此问题。
pip功能将依赖项安装到文件夹而不是系统库或virtualenv中。你可以像这样使用-t标志:
__init__.py
'lib'是要安装到的文件夹。这样,您仍然在requirements.txt中指定依赖项,并使用pip来安装它们,它们只是安装在指定的目录中。正如评论所指出的那样,lib文件夹本身不是一个模块 - 它只包含它们。所以你的lib文件夹不应该有__init__.py
,它应该包含像'twitter'这样的文件夹,它有一个lib
。由于from lib import twitter
不是模块,lib
实际上没有意义。另请注意,pip -t
是一个任意名称,但我们通常按惯例选择。
使用pip进行销售有一些很大的好处,而不仅仅是手动下载依赖项并将它们添加到项目中。一个优点是您不需要将依赖项检查到源代码控制中 - 只需添加requirements.txt,并告诉其他用户也使用lib
命令来提供依赖项。另一个优点是它可以更加有条理地将您的代码与第三方模块完全分开。销售功能的目的是保持这些优势,同时仍遵循App Engine要求在部署时将依赖项包含在目录中。
您正在使用的App Engine供应商扩展程序用于识别文件夹包含已“已销售”的模块并将其添加到路径中。这是您在代码段中使用的供应商扩展程序。它确保import twitter
文件夹位于导入路径中,以便您可以将安装的模块导入其中。
运行vendor.add命令后,您应该可以在lib文件夹中导入模块。正如评论所述,您需要确保它在 appengine_config.py
之前运行。一个好的做法是确保那些供应商命令在其他任何事情之前运行。您可以通过将该代码放在目录中名为appengine_config.py的文件中来实现此目的。这是一个在其他任何东西之前运行的特殊文件。看看这样做的例子here。
最后一些可能有用的说明:
lib
将在GAE环境中运行,或者在运行dev_appserver时运行,该模拟GAE环境。但是,如果您在GAE环境之外运行,请确保您的PYTHONPATH包含要从中导入的{{1}}文件夹。答案 1 :(得分:1)
from google.appengine.ext import vendor
vendor.add('libs')
这些内容会上传到您的应用引擎环境中,您就可以运行它了!