我正在使用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
,但无济于事。有没有办法做到这一点?
答案 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