<p>tl;dr—评论是正确的。”lib'不是模块,而是包含模块的文件夹。它需要在Python导入路径上<em>前面的<code>import twitter</code>,使用<code>vendor.add('lib')</code>,当您部署或使用dev时,它应该正确地设置导入路径_应用服务器.py. 如果您将<code>vendor.add(lib)</code>代码段放在<code>appengine_config.py</code>文件中并运行dev_应用服务器.py或者部署,twitter模块在<code>lib</code>内,您应该能够<code>import twitter</code>。如果您在appengine/devappserver之外运行,则需要确保<code>lib</code>位于PYTHONPATH上。在</p>
<p>以下是对<code>lib</code>文件夹是什么、什么是vendoring以及它们如何适应管理App Engine依赖关系的更大范围的解释。在</p>
<p>使用App Engine,可以指定中的沙盒提供的一些依赖项应用程序yaml. 您可以查看可用库的列表<a href="https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en" rel="nofollow noreferrer">here</a>。对于任何其他依赖项(只能是纯Python库),这些库需要直接包含在项目中。直接将这些依赖项的代码作为项目的一部分(而不仅仅是将它们列在要求.txt并且期望它们在部署时安装)通常被称为“vendoring”。在</p>
<p>现在,尽管我们直接包含了依赖项,但我们宁愿使用pip和a要求.txt,原因如下。但是pip通常用于安装到系统库或virtualenv的库中,而不是项目本身。因此,pip中添加了一个特性,appengine中也添加了一个特性来解决这个问题。在</p>
<p>pip特性将依赖项安装到文件夹中,而不是系统库或virtualenv。您可以这样使用-t标志:</p>
<pre><code>pip install -r requirements.txt -t lib
</code></pre>
<p>其中“lib”是要安装到的文件夹。这样,仍然可以在中指定依赖项要求.txt,并使用pip安装它们,它们只需直接安装到指定的目录中。它本身并不是一个包含注释的模块。所以你的lib文件夹不应该有一个<code>__init__.py</code>,它应该只包含一个像'twitter'这样有一个<code>__init__.py</code>的文件夹。由于<code>lib</code>不是模块,<code>from lib import twitter</code>实际上没有意义。还要注意,<code>lib</code>是一个任意的名称,但是我们通常是按照惯例选择的。在</p>
<p>使用pip而不是手动下载依赖项并将其添加到项目中,这有一些很大的优势。一个优点是不需要将依赖项检查到源代码管理中—只需添加要求.txt,并告诉其他用户使用<code>pip -t</code>命令来提供依赖项。另一个优点是它更具组织性,可以将代码与第三方模块清晰地分开。vendoring特性的要点是保持这些优势,同时仍然遵循appengine的要求,以便在部署时将依赖项包含在目录中。在</p>
<p>您正在使用的App Engine供应商扩展是为了识别文件夹包含已“vendor”的模块,并将其添加到路径中。这是您在代码片段中使用的供应商扩展。它确保<code>lib</code>文件夹在导入路径上,这样您就可以导入安装到其中的模块。在</p>
<p>一旦你运行供应商.add命令,您应该能够导入lib文件夹中的模块。正如注释所述,您需要确保它在</em><code>import twitter</code>之前运行<em>。一个好的做法是确保这些供应商命令在其他命令之前运行。您可以通过将代码放在目录中名为<a href="https://cloud.google.com/appengine/docs/python/tools/appengineconfig?hl=en" rel="nofollow noreferrer">appengine_config.py</a>的文件中来实现这一点。这是一个特殊的文件,运行在任何其他文件之前。看一个这样做的例子<a href="https://github.com/GoogleCloudPlatform/appengine-flask-skeleton/blob/master/appengine_config.py" rel="nofollow noreferrer">here</a>。在</p>
<p>最后几点可能有用的提示:</p>
<ul>
<li><code>appengine_config.py</code>将在GAE环境中运行,或者当您运行模拟GAE环境的dev_appserver时运行。但是,如果您在GAE环境之外运行,请确保PYTHONPATH包含<code>lib</code>文件夹您要从导入。在</li>
<li>既然您可以使用pip提供库,那么您可能会问为什么要使用应用程序yaml?答案是,既然只有纯Python库可以出售,那么您仍然应该使用应用程序yaml任何需要C库的库的依赖关系,比如MySQL。在</li>
<li>如果你有卖图书馆和应用程序yamllibaries,您不希望提供GAE沙盒中的库,因为版本可能会冲突。在这种情况下,最好有一个单独的要求.txt对于您希望提供的依赖项,以及只希望在本地运行时包含但GAE将在沙盒中提供的依赖项。<a href="https://github.com/googlecloudplatform/appengine-django-skeleton" rel="nofollow noreferrer">Here</a>是MySQL的一个例子。在</li>
</ul>