在Google App Engine中创建lib目录并将其添加到sys.path

时间:2014-11-03 07:37:20

标签: python google-app-engine sys.path

我正在使用Flask在Python中编写Google App Engine项目。这是Hello,World的目录结构!应用程序(为简洁起见,省略了第三方库的内容):

project_root/
    flask/
    jinja2/
    markupsafe/
    myapp/
        __init__.py
    simplejson/
    werkzeug/
    app.yaml
    itsdangerous.py
    main.py

这是main.py

from google.appengine.ext.webapp.util import run_wsigi_app
from myapp import app

run_wsgi_app(app)

myapp/__init__.py

from flask import Flask

app = Flask("myapp")

@app.route("/")
def hello():
    return "Hello, World!"

由于Flask有很多依赖项和子依赖项,我认为通过将所有第三方代码放在一个子目录(比如project_root/lib)中来整理目录结构会很好。当然,然后sys.path不知道在哪里找到这些库。

我已尝试过How do you modify sys.path in Google App Engine (Python)?中的解决方案,但这似乎不起作用。我也尝试将from flask import Flask更改为from lib/flask import Flask,但无济于事。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:3)

添加一个名为appengine_config.py的python文件,其中包含以下内容。

import sys
import os.path

sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))

正如Tim Hoffman所说,在启动新实例时会调用appengine_config.py一次。

现在你可以做你想做的事了。将所有第三方库添加到lib文件夹。

答案 1 :(得分:1)

看看在appengine_config.py中定义你的路径操作这意味着任何路径操作只需要执行一次。

然后根据您的建议将第三方文件移到lib中。 使用相对路径' lib'通过指定sys.path

sys.path.insert(0,'./lib')

或使用

import site
site.addsitedir("./lib")

不要使用绝对路径,因为在部署代码时它们不会相同。

有时候把你的lib放在第一位可能很有用,特别是如果你不想要google提供的webob版本。

答案 2 :(得分:0)

尝试添加lib的完整路径,例如sys.path[0:0] = ['/home/user/project_root/lib']

答案 3 :(得分:-2)

我之前在编写自己的GoogleAppEngine®产品时,实际上遇到过这个问题。我的解决方案是将文件合并在一起形成一个大的python文件。执行此操作的命令是:

cat *.py

当然,您可能需要修复单个文件中的import语句。这可以通过一个简单的sed命令来完成,以搜索与cat命令中使用的文件名匹配的文件中的import语句。但与实际创建巨大的python文件(简称HPF)相比,这是一个相对简单的命令。

将它们组合在一起的另一个好处是提高了速度:因为python不需要一直加载一大堆无用的小文件,所以运行速度会快得多。这意味着您的GoogleAppEngine®产品的用户无需等待疯狂的长文件加载延迟。

当然,更新库可能很棘手。我建议保留用于将文件合并在一起的目录树,以便将来轻松更新。您需要做的就是复制新文件并重新运行cat和sed命令。可以把它想象为预编译你的python库。

一切顺利!

-Milo