2012-01-20 17 views
6

ho creato una web app pitone con questa struttura di directory:non può importare il modulo

# cd /usr/local/www/myapp 

modules 
    layout 
     __init__.py 
     layout.py 
packages 
public 
myapp.wsgi 

ho impostato il mio PYTHONPATH a:

/usr/local/www/myapp/modules:/usr/local/www/myapp/packages 

In myapp.wsgi che cerco di fare:

import layout 

Ma sto ricevendo errore del server interno. Perché?

Questo è il mio myapp.wsgi (se mi tolgo la linea di layout di importazione, funziona):

import sys 
import wsgiref 
import layout  
def application(environ, start_response): 
     response_status = '200 OK' 
     response_body = 'Hello! ' 
     response_headers = [] 
     content_type = ('Content-type', 'text-plain') 
     content_length = ('Content-Length', str(len(response_body))) 
     response_headers.append(content_type) 
     response_headers.append(content_length) 
     start_response(response_status, response_headers) 
     return [response_body] 

messaggio di errore completo sto ottenendo:

Internal Server Error 

The server encountered an internal error or misconfiguration and was unable to complete your request. 

Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error. 

More information about this error may be available in the server error log. 

La mia configurazione virtualhost:

<VirtualHost *:80> 

    ServerName localhost 
    ServerAlias localhost 
    ServerAdmin [email protected] 

    DocumentRoot /usr/local/www/myapp/public 

    <Directory /usr/local/www/myapp/public> 
    Order allow,deny 
    Allow from all 
    </Directory> 

    WSGIScriptAlias//usr/local/www/myapp/myapp.wsgi 

    <Directory /usr/local/www/myapp> 
    Order allow,deny 
    Allow from all 
    </Directory> 

</VirtualHost> 

Errore da /var/log/httpd-error.log:

[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] mod_wsgi (pid=1725): Target WSGI script '/usr/local/www/myapp/myapp.wsgi' cannot be loaded as Python module. 
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] mod_wsgi (pid=1725): Exception occurred processing WSGI script '/usr/local/www/myapp/myapp.wsgi'. 
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] Traceback (most recent call last): 
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] File "/usr/local/www/myapp/myapp.wsgi", line 3, in <module> 
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123]  import layout 
[Fri Jan 20 15:31:03 2012] [error] [client 192.168.201.123] ImportError: No module named layout 

uscita di sys.path stampa:

enter image description here

+1

Almeno includere il messaggio di errore completo ed esatto che si sta ottenendo. – unwind

+0

Come stai usando il web server? È molto probabile che non si usi il proprio ambiente, quindi l'impostazione di PYTHONPATH per la propria shell non sarà di aiuto. – geoffspear

+0

Sto usando Apache mod_wsgi e ho creato un host virtuale per/usr/local/www/myapp. –

risposta

8

Prima prova:

python /usr/local/www/myapp/myapp.wsgi 

vuol caricare correttamente?

Se sì, probabilmente si dispone di un ambiente (nel ~/.bashrc o simile) necessario per l'app. Prova ::

# to wipe-out extra env 
env -i bash 
# try again 
python /usr/local/www/myapp/myapp.wsgi 

Verificare di utilizzare lo stesso pitone nella shell come quello usato da WSGI apache.

Se il myapp.wsgi bisogno di alcun ENV in più per caricare correttamente, allora si può fare una delle:

  • set python path in Apache, o
  • insieme in runtime nel vostro myapp.wsgi

Per inserire il codice WSGI, ecco il codice di esempio.

import os, sys 
EXTRA_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')) 
if EXTRA_DIR not in sys.path: 
    sys.path.append(EXTRA_DIR) 

Inserire all'inizio del file myapp.wsgi.

+0

Ho provato tutto questo. Niente ha funzionato env -i bash non funziona perché sto usando FreeBSD. –

+0

se non riesci a fare 'env -i', ispeziona manualmente il tuo comando di ambiente' env' e gli script del tuo profilo. Usi un virtualenv o qualcosa del genere? –

+0

qual è l'output di 'python/usr/local/www/myapp/myapp.wsgi'? –

1

Hai __init.__py nella cartella layout, ma dovrebbe essere __init__.py. Il periodo è fuori luogo. Non sono sicuro che si tratti di un errore di battitura nel tuo post o meno, ma se questo è ciò che sembra il tuo file causerebbe questo problema.

+0

Questo è solo un errore di battitura. Scusate. –

0

La directory dei moduli richiede anche un file __init__.py da definire come un pacchetto.

+1

'modules' non è un pacchetto (basato sul' PYTHONPATH' indicato). – jrennie

0

ho avuto un problema simile e questo risolto:

chmod a+x myapp.wsgi 
0

Secondo http://webpy.org/install#apachemodwsgi

If you get an "ImportError: No module named web" in your apache error.log file, you could try setting the absolute path in code.py before importing web:

import sys, os 
abspath = os.path.dirname(__file__) 
sys.path.append(abspath) 
os.chdir(abspath) 
import web 

Funziona per me in modo drammatico.

Problemi correlati