2016-01-24 68 views
0

當我嘗試訪問應用程序根目錄下的lib目錄內的庫時,出現ImportError錯誤。如何從Python Google App Engine中的模塊訪問自營庫?

我的確在documentation必要的步驟,它只有一個模塊的工作,但一旦我搬到了多個模塊,該目錄結構就不再起作用:

<app root> 
    | 
    +-- appengine_config.py 
    | 
    +-- lib 
    | 
    +-- modules  
     +-- module1 
     | 
     +-- module2 

在我appengine_config.py我添加line:vendor.add(os.path.join(os.path.dirname(__file__), 'lib'))

對這裏可能發生的事情有任何想法?

編輯: 此目錄結構,似乎爲我工作:

<app root> 
    | 
    +-- lib 
    |  
    +-- module1 
    |  +-- appengine_config.py 
    |  | 
    |  +-- app.yaml 
    |  | 
    |  +-- lib <symlink to app root lib> 
    +-- module2 (same as module 1) 

我認爲appengine_config.py是在主應用程序級別定義的東西,而不是在模塊級。在每個模塊中複製相同的確切文件和sym鏈接是否正確?

+0

您的模塊的「.yaml」文件位於何處?我的意思是你是否遵循doc中的第1或第2個應用程序結構建議:https://cloud.google.com/appengine/docs/python/modules/#Python_Configuration –

+0

頂層yaml文件,如'queue.yaml', 'cron.yaml'等位於app根目錄,而'app.yaml'文件位於'modules/module1','modules/module2'目錄中。我主要關注第一個應用程序結構,但將所有模塊嵌套在模塊目錄中。對於命名混淆,很抱歉,它可能與您的標準Python模塊混淆。 – user5831382

回答

0

每個模塊目錄上傳作爲一個獨立的應用程序,它需要一個模塊目錄中的所有文件(即從模塊的目錄沒有被上傳/模塊中可見)。模塊目錄是包含模塊的.yaml文件的目錄,因此在您的情況下,它們將是modules/module1modules/module2目錄。

因此,將應用程序目錄中的lib目錄和appengine_config.py符號鏈接到模塊的目錄中。另外,對於我的應用程序,正如Tim提到的那樣,工作的售貨線確實只是vendor.add('lib')。複製它們同樣適用,但符號鏈接更好,因爲您只需要在DRY精神中保持版本控制系統中的一個副本。 appcfg.py腳本知道遵循符號鏈接並上傳符號鏈接指向的實際文件。

如果你不需要所有但只有模塊中的庫的一些您可以創建在該模塊DIR一個lib目錄,只有符號鏈接的應用程序的lib目錄的必要子目錄到各個模塊的lib目錄(不要上傳不必要的文件)。

可能需要也符號鏈接到一些模塊迪爾斯其他應用程序級別的配置文件,以保持開發服務器上的一些支持腳本的快樂,看到這樣的回答:https://stackoverflow.com/a/34111170/4495081。請注意,更新應用程序級別的配置可能不會簡單地通過上傳單模塊應用程序教程中提到的模塊代碼來發生,他們需要明確地請求appcfg.py的相應參數,如在備忘單中所述那個答案。

+0

非常感謝大家。很好的解釋! – user5831382

0

爲什麼在vendor.add中包含os.path.dirname(文件)?

看看文檔。 https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=en#vendoring

vendor.add('lib')或最差 vendor.add('lib/modules')是你所需要的。

modules真的是模塊/包嗎?

+0

我原本是'vendor.add('lib')',但它沒有工作,所以我只是嘗試了[文檔]中提到的提示(https://cloud.google.com/appengine/docs/python/工具/ libraries27?HL = EN#vendoring)。 'modules'是我保存所有模塊的目錄。希望在一個地方組織我所有的不同模塊。 – user5831382

+0

我也試過將所有的應用程序引擎模塊從modules目錄下移到應用程序根目錄。我用'dev_appserver.py'測試了btw。 – user5831382

+0

實際上它看起來像'appengine_config.py'在應用程序根目錄下時根本沒有運行。當我將它移動到module1內部並在module1中創建一個符號鏈接以指向主lib目錄時,它似乎實際運行該文件。 編輯我的原始問題似乎有幫助的東西。 – user5831382

相關問題