谷歌应用引擎如何添加lib文件夹?

2024-05-12 21:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在强调:在我的lib模块中没有名为twitter的模块

详细信息:

  1. twitter模块位于lib目录中。在
  2. lib目录有一个空的init.py
  3. 我在目录外的一个页面上得到了错误
  4. 当我把twitter模块从lib目录中取出并说importtwitter时,它就起作用了
  5. 当我把twitter模块放回lib中并说from lib import twitter,或者说import twitter,或者说importlib.twitter网站上面写着,去****并喜欢它
  6. 我试着这样做:https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en,这意味着:

若要告诉应用程序如何在此目录中查找库,请创建(或修改)名为appengine的文件_配置.py在项目的根目录下,添加以下行:

from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add('lib')

然后尝试导入twitter,并尝试从lib导入twitter,结果显示,“哈哈,不错的尝试。”

现在呢?在


Tags: 模块frompyimport目录initlib错误
2条回答

tl;dr—评论是正确的。”lib'不是模块,而是包含模块的文件夹。它需要在Python导入路径上前面的import twitter,使用vendor.add('lib'),当您部署或使用dev时,它应该正确地设置导入路径_应用服务器.py. 如果您将vendor.add(lib)代码段放在appengine_config.py文件中并运行dev_应用服务器.py或者部署,twitter模块在lib内,您应该能够import twitter。如果您在appengine/devappserver之外运行,则需要确保lib位于PYTHONPATH上。在

以下是对lib文件夹是什么、什么是vendoring以及它们如何适应管理App Engine依赖关系的更大范围的解释。在

使用App Engine,可以指定中的沙盒提供的一些依赖项应用程序yaml. 您可以查看可用库的列表here。对于任何其他依赖项(只能是纯Python库),这些库需要直接包含在项目中。直接将这些依赖项的代码作为项目的一部分(而不仅仅是将它们列在要求.txt并且期望它们在部署时安装)通常被称为“vendoring”。在

现在,尽管我们直接包含了依赖项,但我们宁愿使用pip和a要求.txt,原因如下。但是pip通常用于安装到系统库或virtualenv的库中,而不是项目本身。因此,pip中添加了一个特性,appengine中也添加了一个特性来解决这个问题。在

pip特性将依赖项安装到文件夹中,而不是系统库或virtualenv。您可以这样使用-t标志:

pip install -r requirements.txt -t lib

其中“lib”是要安装到的文件夹。这样,仍然可以在中指定依赖项要求.txt,并使用pip安装它们,它们只需直接安装到指定的目录中。它本身并不是一个包含注释的模块。所以你的lib文件夹不应该有一个__init__.py,它应该只包含一个像'twitter'这样有一个__init__.py的文件夹。由于lib不是模块,from lib import twitter实际上没有意义。还要注意,lib是一个任意的名称,但是我们通常是按照惯例选择的。在

使用pip而不是手动下载依赖项并将其添加到项目中,这有一些很大的优势。一个优点是不需要将依赖项检查到源代码管理中—只需添加要求.txt,并告诉其他用户使用pip -t命令来提供依赖项。另一个优点是它更具组织性,可以将代码与第三方模块清晰地分开。vendoring特性的要点是保持这些优势,同时仍然遵循appengine的要求,以便在部署时将依赖项包含在目录中。在

您正在使用的App Engine供应商扩展是为了识别文件夹包含已“vendor”的模块,并将其添加到路径中。这是您在代码片段中使用的供应商扩展。它确保lib文件夹在导入路径上,这样您就可以导入安装到其中的模块。在

一旦你运行供应商.add命令,您应该能够导入lib文件夹中的模块。正如注释所述,您需要确保它在import twitter之前运行。一个好的做法是确保这些供应商命令在其他命令之前运行。您可以通过将代码放在目录中名为appengine_config.py的文件中来实现这一点。这是一个特殊的文件,运行在任何其他文件之前。看一个这样做的例子here。在

最后几点可能有用的提示:

  • appengine_config.py将在GAE环境中运行,或者当您运行模拟GAE环境的dev_appserver时运行。但是,如果您在GAE环境之外运行,请确保PYTHONPATH包含lib文件夹您要从导入。在
  • 既然您可以使用pip提供库,那么您可能会问为什么要使用应用程序yaml?答案是,既然只有纯Python库可以出售,那么您仍然应该使用应用程序yaml任何需要C库的库的依赖关系,比如MySQL。在
  • 如果你有卖图书馆和应用程序yamllibaries,您不希望提供GAE沙盒中的库,因为版本可能会冲突。在这种情况下,最好有一个单独的要求.txt对于您希望提供的依赖项,以及只希望在本地运行时包含但GAE将在沙盒中提供的依赖项。Here是MySQL的一个例子。在
  1. 创建一个名为“libs”的文件夹(在webapp的主目录中)
  2. 如果是一个库,那么只需做:pip install-t libs/your_library_name
  3. 如果有多个库,请执行以下操作: 冻结点>;要求.txt, pip安装-r要求.txt-图书馆
  4. 现在,创建一个名为appengine的文件_配置.py(再次在主目录中)
  5. 在上面的文件中,添加: from google.appengine.ext import vendor vendor.add('libs')

这些会上传到你的应用引擎环境,你就可以运行它了!在

相关问题 更多 >