Python 谷歌应用引擎-如何添加库文件夹?

Python 谷歌应用引擎-如何添加库文件夹?,python,google-app-engine,twitter,Python,Google App Engine,Twitter,我一直在担心:在我的lib模块中没有名为twitter的模块 详情: twitter模块位于lib目录中 lib目录有一个空的init.py 我在目录外的一个页面上得到了错误 当我从lib目录中取出twitter模块并只说importtwitter时,它就工作了 当我把twitter模块放回lib中,说from lib import twitter,或者说import twitter,或者说import lib.twitter时,它会说,转到****并喜欢它 我试着这样做:,这表明: 要告诉应用

我一直在担心:在我的lib模块中没有名为twitter的模块

详情:

  • twitter模块位于lib目录中
  • lib目录有一个空的init.py
  • 我在目录外的一个页面上得到了错误
  • 当我从lib目录中取出twitter模块并只说importtwitter时,它就工作了
  • 当我把twitter模块放回lib中,说from lib import twitter,或者说import twitter,或者说import lib.twitter时,它会说,转到****并喜欢它
  • 我试着这样做:,这表明:
  • 要告诉应用程序如何在此目录中查找库,请在项目根目录中创建(或修改)一个名为appengine_config.py的文件,然后添加以下行:

    from google.appengine.ext import vendor
    
    # Add any libraries installed in the "lib" folder.
    vendor.add('lib')
    
    然后尝试导入推特,然后尝试从lib导入推特,它说,“哈哈,很好的尝试。”


    现在怎么办;博士——评论是对的。”“lib”不是一个模块,它是一个包含模块的文件夹。在使用
    vendor.add('lib')
    导入twitter之前,它需要位于Python导入路径上,这应该在部署或使用dev_appserver.py时正确设置导入路径。如果您将
    vendor.add(lib)
    代码段放入
    appengine\u config.py
    文件并运行dev\u appserver.py或deploy,并且twitter模块位于
    lib
    中,您应该能够
    导入twitter
    。如果您在appengine/devappserver之外运行,则需要确保PYTHONPATH上有
    lib

    下面是关于
    lib
    文件夹的详细说明;什么是自动售货机;以及它们如何适应管理应用程序引擎依赖关系的大局

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

    现在,即使我们直接包含依赖项,我们还是宁愿使用pip和requirements.txt,原因如下。但pip通常用于安装到系统库或virtualenv的库中,而不是安装到项目本身中。因此,pip中添加了一个功能,App Engine中添加了一个功能来修复此问题

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

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

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

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

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

    最后几点提示可能会有所帮助:

    • appengine\u config.py
      将在GAE环境中运行,或者在运行模拟GAE环境的dev\u appserver时运行。但是,如果您在GAE环境之外运行,请确保PYTHONPATH包含要从中导入的
      lib
      文件夹
    • 既然您可以使用pip创建供应商库,您可能会问,为什么要使用app.yaml包含依赖项?答案是,因为只有纯Python库可以出售,所以对于任何需要C库的库,如MySQL,您仍然应该使用app.yaml依赖项
    • 如果您有供应商库和app.yaml库,则不希望供应商库位于GAE沙箱中,因为版本可能会冲突。在这种情况下,最好为要提供的依赖项和仅在本地运行时才包含但GAE将在沙箱中提供的依赖项单独设置requirements.txt。是MySQL的一个例子

      • tl;博士——评论是对的。”“lib”不是一个模块,它是一个包含模块的文件夹。这是必须的