我一直得到ImportError:在我的lib模块中没有名为twitter的模块
细节:
twitter模块位于lib目录中.
lib目录有一个空的init .py
我在目录外的页面上收到错误
当我将twitter模块从lib目录中取出并只是说导入twitter时,它可以工作
当我把twitter模块放回lib里面并从lib导入twitter说,或者当我说导入twitter,或者说导入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'不是模块,它是包含模块的文件夹.它需要你的Python导入路径上之前您import twitter
使用vendor.add('lib')
在部署或使用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中指定沙箱提供的一些依赖项.您可以在此处查看可用库列表.对于任何其他依赖项(只能是纯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文件夹不应该有__init__.py
,它应该只包含像'twitter'这样的文件夹__init__.py
.既然lib
不是模块,from lib import twitter
实际上没有意义.另请注意,这lib
是一个任意名称,但我们通常按惯例选择.
使用pip进行销售有一些很大的优势,而不仅仅是手动下载依赖项并将它们添加到项目中.一个优点是您不需要检查源控件中的依赖项 - 只需添加requirements.txt,并告诉其他用户也使用该pip -t
命令来提供依赖项.另一个优点是它可以更加有条理地将您的代码与第三方模块完全分开.销售功能的重点是保持这些优势,同时仍遵循App Engine要求在部署时将依赖项包括在目录中.
您正在使用的App Engine供应商扩展程序用于识别文件夹包含已被"销售"的模块并将其添加到路径中.这是您在代码段中使用的供应商扩展程序.它确保lib
文件夹位于导入路径中,以便您可以将安装的模块导入其中.
运行vendor.add命令后,您应该能够在lib文件夹中导入模块.正如评论所述,您需要确保它之前 运行import twitter
.一个好的做法是确保那些供应商命令在其他任何事情之前运行.您可以通过将该代码放在目录中名为appengine_config.py的文件中来实现此目的.这是一个在其他任何东西之前运行的特殊文件.看看这里做的一个例子.
最后一些可能有用的注意事项:
appengine_config.py
将在GAE环境中运行,或者在运行dev_appserver时运行,该模拟GAE环境.但是,如果您在GAE环境之外运行,请确保您的PYTHONPATH包含lib
要从中导入的文件夹.
既然您可以使用pip供应商库,您可能会问为什么要使用app.yaml包含依赖项?答案是,由于只能销售纯Python库,因此您仍然应该将app.yaml依赖项用于任何需要C库的库,例如MySQL.
如果您已经销售了库和app.yaml库,那么您不希望供应库位于GAE沙箱中,因为版本可能会发生冲突.在这种情况下,最好为您想要供应商的依赖关系设置单独的requirements.txt,并且只有在本地运行时才包含所需的依赖关系,但GAE将在沙箱中提供.这是MySQL的一个例子.