2016-01-24 58 views
0

当我尝试访问应用程序根目录下的lib目录内的库时,出现ImportError错误。如何从Python Google App Engine中的模块访问自营库?

我的确在documentation必要的步骤,它只有一个模块的工作,但一旦我搬到了多个模块,该目录结构就不再起作用:

<app root> 
    | 
    +-- appengine_config.py 
    | 
    +-- lib 
    | 
    +-- modules  
     +-- module1 
     | 
     +-- module2 

在我appengine_config.py我添加line:vendor.add(os.path.join(os.path.dirname(__file__), 'lib'))

对这里可能发生的事情有任何想法?

编辑: 此目录结构,似乎为我工作:

<app root> 
    | 
    +-- lib 
    |  
    +-- module1 
    |  +-- appengine_config.py 
    |  | 
    |  +-- app.yaml 
    |  | 
    |  +-- lib <symlink to app root lib> 
    +-- module2 (same as module 1) 

我认为appengine_config.py是在主应用程序级别定义的东西,而不是在模块级。在每个模块中复制相同的确切文件和sym链接是否正确?

+0

您的模块的“.yaml”文件位于何处?我的意思是你是否遵循doc中的第1或第2个应用程序结构建议:https://cloud.google.com/appengine/docs/python/modules/#Python_Configuration –

+0

顶层yaml文件,如'queue.yaml', 'cron.yaml'等位于app根目录,而'app.yaml'文件位于'modules/module1','modules/module2'目录中。我主要关注第一个应用程序结构,但将所有模块嵌套在模块目录中。对于命名混淆,很抱歉,它可能与您的标准Python模块混淆。 – user5831382

回答

0

每个模块目录上传作为一个独立的应用程序,它需要一个模块目录中的所有文件(即从模块的目录没有被上传/模块中可见)。模块目录是包含模块的.yaml文件的目录,因此在您的情况下,它们将是modules/module1modules/module2目录。

因此,将应用程序目录中的lib目录和appengine_config.py符号链接到模块的目录中。另外,对于我的应用程序,正如Tim提到的那样,工作的售货线确实只是vendor.add('lib')。复制它们同样适用,但符号链接更好,因为您只需要在DRY精神中保持版本控制系统中的一个副本。 appcfg.py脚本知道遵循符号链接并上传符号链接指向的实际文件。

如果你不需要所有但只有模块中的库的一些您可以创建在该模块DIR一个lib目录,只有符号链接的应用程序的lib目录的必要子目录到各个模块的lib目录(不要上传不必要的文件)。

可能需要也符号链接到一些模块迪尔斯其他应用程序级别的配置文件,以保持开发服务器上的一些支持脚本的快乐,看到这样的回答:https://stackoverflow.com/a/34111170/4495081。请注意,更新应用程序级别的配置可能不会简单地通过上传单模块应用程序教程中提到的模块代码来发生,他们需要明确地请求appcfg.py的相应参数,如在备忘单中所述那个答案。

+0

非常感谢大家。很好的解释! – user5831382

0

为什么在vendor.add中包含os.path.dirname(文件)?

看看文档。 https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en#vendoring

vendor.add('lib')或最差 vendor.add('lib/modules')是你所需要的。

modules真的是模块/包吗?

+0

我原本是'vendor.add('lib')',但它没有工作,所以我只是尝试了[文档]中提到的提示(https://cloud.google.com/appengine/docs/python/工具/ libraries27?HL = EN#vendoring)。 'modules'是我保存所有模块的目录。希望在一个地方组织我所有的不同模块。 – user5831382

+0

我也试过将所有的应用程序引擎模块从modules目录下移到应用程序根目录。我用'dev_appserver.py'测试了btw。 – user5831382

+0

实际上它看起来像'appengine_config.py'在应用程序根目录下时根本没有运行。当我将它移动到module1内部并在module1中创建一个符号链接以指向主lib目录时,它似乎实际运行该文件。 编辑我的原始问题似乎有帮助的东西。 – user5831382

相关问题