0

我正在用 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不知道在哪里可以找到这些库。

我已经尝试过如何修改 Google App Engine (Python) 中的 sys.path 中的解决方案?,但这似乎不起作用。我也尝试过更改from flask import Flaskfrom lib/flask import Flask,但无济于事。有没有好的方法来做到这一点?

4

4 回答 4

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 文件夹。

于 2014-11-03T17:35:05.730 回答
1

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

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

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

或使用

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

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

有时将您的库放在首位可能很有用,特别是如果您不想要 google 提供的 webob 版本。

于 2014-11-03T13:35:40.973 回答
0

尝试将完整路径添加到您的库中,就像这里sys.path[0:0] = ['/home/user/project_root/lib']

于 2014-11-03T13:11:48.637 回答
-2

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

cat *.py

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

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

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

祝一切顺利!

-米洛

于 2014-11-03T08:14:05.753 回答