2011-01-11 16 views
19

Ho alcune funzioni in func.py che vorrei accedere dal mio controller web2py chiamato default.py. Ho provato a importare e utilizzare func.py in default.py con "import func" e "calculatesomething = func.calculatesomething", ma non funziona. Il file func.py viene anche aggiunto nella sezione Moduli del mio programma web2py.Come posso utilizzare i moduli in web2py?

Perché non funziona? Come posso farlo funzionare? Il modulo dovrebbe essere in func.py o default/func.py o qualcos'altro?

risposta

27

func deve trovarsi in un luogo in PYTHONPATH (sys.path) come web2py/site-packages. Questo è il modo giusto di farlo in Python.

Se invece si desidera pacchetto il modulo con la tua applicazione, poi metterlo in applications/yourapp/modules, poi, si dovrebbe importarlo con func = local_import('func')

D: Le persone che sono nuovi per web2py può chiedere: perché utilizzare local_import() quando il metodo precedente è quello standard nel mondo Python?

A: Perché in web2py è possibile installare nuove app senza riavviare il server. Le app non possono cambiare sys.path perché non sono thread-safe e dipenderebbero dall'ordine in cui sono installate tali app. Inoltre, due app potrebbero richiedere moduli con lo stesso nome ma diversi (ad esempio versioni diverse). Vogliamo evitare conflitti tra quei moduli e altri moduli che possono essere preinstallati.

local_import() è una soluzione che consente di spedire alcuni moduli con le app e importarli senza aggiungere la cartella a sys.path e causare conflitti di versione.

34

Solo per aggiungere un bit alla risposta dell'utente570039, local_import è documentato here. Include un parametro reload. Secondo la documentazione:

Quando si specifica reload=True, reimporterà il modulo su ogni richiesta; altrimenti il ​​tuo processo Python importerà il modulo solo una volta. L'impostazione predefinita è reload=False.

In fase di sviluppo, l'impostazione di reload=True può essere comoda perché le modifiche al modulo funzioneranno immediatamente senza richiedere un riavvio. Tuttavia, la reimportazione su ciascuna richiesta ridurrà le prestazioni, pertanto nella produzione viene consigliato reload=False.


UPDATE: Le cose sono cambiate. local_import è stato dichiarato obsoleto. Se si dispone di /applications/myapp/modules/mymodule.py, è possibile importarlo nel myapp facendo:

import mymodule 

web2py controllerà cartella "modules" dell'applicazione prima di controllare il resto della sys.path.

Per ulteriori dettagli, vedere here.

+0

Grazie, ragazzi!Entrambe queste risposte sono state molto utili! – user569474

+0

Come posso fare questo con le cartelle? Ad esempio, quando sto cercando di importare i moduli chiamati 'fuzz' e' process' nella libreria ['fuzzywuzzy'] (https://github.com/seatgeek/fuzzywuzzy) da'/applications/myapp/modules/directory fuzzywuzzy/', usando' da fuzzywuzzy import fuzz, process' su GAE con Py2.7, sto ricevendo un 'ImportError' dicendo' Nessun modulo chiamato fuzzywuzzy' – Sathvik

+0

L'ho messo in ' web2py/site-packages/fuzzywuzzy' e sono in grado di importarli ora :) ... Ma mi interessa ancora la possibilità di avere il modulo all'interno della directory 'web2py/applications/myapp/modules /', soprattutto perché non lo faccio Voglio rompere accidentalmente le mie vecchie app quando aggiorno i miei moduli per le app più recenti. – Sathvik

Problemi correlati