【问题标题】:Creating a lib directory in Google App Engine and adding it to sys.path在 Google App Engine 中创建一个 lib 目录并将其添加到 sys.path
【发布时间】:2014-11-03 07:37:20
【问题描述】:

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

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,但无济于事。有什么好办法吗?

【问题讨论】:

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


    【解决方案1】:

    添加一个名为 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 文件夹中。

    【讨论】:

    • 好答案。我给了@TimHoffman 接受的答案,只是因为他先回答并且他的代码更简洁。
    【解决方案2】:

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

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

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

    或使用

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

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

    将你的库放在首位有时会很有用,尤其是当你不想要谷歌提供的 webob 版本时。

    【讨论】:

    • 非常感谢!昨晚我花了一个小时把头撞在墙上。这在第一次尝试时有效。
    【解决方案3】:

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

    【讨论】:

    • 绝对路径不起作用,因为那样我将无法在本地测试环境和 App Engine 运行时运行代码。
    【解决方案4】:

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

    cat *.py
    

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

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

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

    一切顺利!

    -米洛

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多