2014-11-03 60 views
0

我正在用Flask編寫一個Python App Engine項目。這是我的Hello,World的目錄結構!應用程序(ommitted爲簡潔起見第三方庫的內容):在Google App Engine中創建一個lib目錄並將其添加到sys.path

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!" 

由於瓶有這麼多的依賴和子的依賴,我認爲通過將所有第三方代碼放在一個子目錄中來清理目錄結構會很好(比如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,無濟於事。有沒有一個好的方法來做到這一點?

回答

1

看,這意味着任何路徑操作只需要進行一次。

然後根據您的建議將第三方文件移動到lib中。 使用相對路徑「LIB」通過指定的sys.path

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

或使用

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

不要使用絕對路徑,因爲他們將是不一樣的,當你部署你的代碼。

把你的lib放在第一位有時會很有用,特別是如果你不想google提供的webob版本。

+0

非常感謝!昨晚我花了一個小時在牆上敲打我的頭。這是第一次嘗試。 – 2014-11-03 20:38:43

-2

我以前在編寫自己的Google AppEngine®產品時遇到過這個問題。我的解決方案是將這些文件放在一起形成一個大型的python文件。執行此操作的命令是:

cat *.py 

當然,您可能需要修復單個文件中的導入語句。這可以通過一個簡單的sed命令在與cat命令中使用的文件名匹配的文件中搜索導入語句來完成。但與實際創建巨大的python文件(簡稱HPF)相比,這是一個相對簡單的命令。

將它們結合在一起的另一個優勢是提高了速度:因爲python不需要一直加載一大堆無用的小文件,所以運行速度會更快。這意味着您的Google AppEngine®產品用戶無需等待瘋狂的長文件加載延遲。

當然,更新庫可能會很棘手。我建議保留目錄樹,以便在未來輕鬆更新文件。您只需複製新文件並重新運行cat和sed命令。想想它就像預編譯你的Python庫。

一切順利!

-Milo

0

嘗試在appengine_config.py定義你的路徑操作的完整路徑添加到庫,喜歡這裏sys.path[0:0] = ['/home/user/project_root/lib']

+0

絕對路徑不起作用,因爲那樣我就無法在本地測試環境和App Engine運行時運行代碼。 – 2014-11-03 20:40:53

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

+0

很好的答案。我只是因爲他先回答了,他的代碼更簡潔纔給予@TimHoffman接受的答案。 – 2014-11-03 20:39:39

相關問題