2011-01-11 101 views
19

我在func.py中有一些功能,我想從我的web2py控制器訪問,名爲default.py。我試圖導入並使用func.pydefault.py與「導入func」和「calculateomething = func.calculatesomething」,但它不起作用。文件func.py也添加到我的web2py程序的Modules部分。如何在web2py中使用模塊?

爲什麼它不起作用?我怎樣才能使它工作?模塊是否應該在func.pydefault/func.py或其他?

回答

27

func必須位於PYTHONPATH(sys.path)的位置,例如web2py/site-packages。這是正確的Pythonic做法。

相反,如果你想封裝與應用你的模塊,然後將其放在applications/yourapp/modules,接下來,你應該將其導入func = local_import('func')

問:的人誰是新的web2py可能會懷疑:爲什麼當前一種方法是Python世界中的標準方法時,使用local_import()

- 答:因爲在web2py你可以安裝新的應用程序,而無需重新啓動服務器。應用程序無法更改sys.path,因爲它不是線程安全的,並且取決於安裝這些應用程序的順序。此外,兩個應用程序可能需要具有相同名稱但不同的模塊(例如不同的版本)。我們希望避免這些模塊與其他可能預裝的模塊之間發生衝突。

local_import()是一種解決方法,它允許您將某些模塊與您的應用一起發貨,並導入它們而不會將文件夾添加到sys.path並導致版本衝突。

34

只需向user570039的答案添加一點,local_import記錄here。它包括一個reload參數。根據文檔:

當您指定reload=True時,它將在每次請求時重新導入模塊;否則你的python進程只會導入一次模塊。缺省值是reload=False

在開發中,設置reload=True可能很方便,因爲您的模塊更改將立即生效而不需要重新啓動。但是,每次請求重新導入都會降低性能,因此建議在生產中使用reload=False


UPDATE:事情已經改變了。 local_import已被棄用。如果你有/applications/myapp/modules/mymodule.py,您可以通過執行MYAPP內導入:

import mymodule 

的web2py將檢查sys.path中的其餘部分之前檢查應用程序的「模塊」文件夾中。

有關更多詳細信息,請參見here

+0

謝謝,夥計們!這兩個答案都非常有幫助! – user569474 2011-01-26 07:47:02