Impossible d'importer le module
J'ai créé une application web en python avec cette structure de répertoire:
# cd /usr/local/www/myapp
modules
layout
__init__.py
layout.py
packages
public
myapp.wsgi
J'ai réglé mon PYTHONPATH à:
/usr/local/www/myapp/modules:/usr/local/www/myapp/packages
Dans myapp.wsgi j'essaie de faire:
import layout
Mais je suis arriver erreur Interne du serveur. Pourquoi?
C'est mon myapp.wsgi (si j'ai supprimer l'importation disposition de la ligne, il fonctionne):
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]
Plein de message d'erreur que j'obtiens:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@example.com 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.
Mon virtualhost configuration:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
ServerAdmin webmaster@example.com
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>
D'erreur dans /var/log/httpd-erreur.journal:
[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
Sortie de print sys.chemin d'accès:
- Au moins inclure le plein et le message d'erreur exact que vous obtenez.
- La façon dont vous exécutez le serveur web? Il est fort probable que vous n'utilisez pas votre environnement, afin de réglage PYTHONPATH pour votre propre coque ne va pas aider.
- Je suis à l'aide d'Apache mod_wsgi et j'ai créé un virtual host pour /usr/local/www/myapp.
- Ajouté le message d'erreur que j'obtiens dans le navigateur et ma configuration d'un hôte virtuel.
- Le message d'erreur que vous avez posté n'est pas le message d'erreur nous sommes à la recherche pour---comme il le note, vérifiez le journal des erreurs du serveur. Pour un Look python "Traceback". Aussi, je me demande si vous êtes simplement en spécifiant l'importation de manière incorrecte. Si
layout.py
contient le code qui vous intéresse, vous devez faireimport layout.layout
oufrom layout import layout
. - J'ai ajouté erreur de var/log/httpd-erreur.journal. J'ai aussi essayé d'importation de mise en page.mise en page, mais il jette la même erreur.
- J'avais parié sur @Wooble de la théorie de l'---le serveur est en utilisant un autre PYTHONPATH. Essayez d'imprimer de journalisation/
sys.path
à partir de votre script à voir (vous aurez besoin deimport sys
premier). - J'ai ajouté de la sortie de print sys.chemin d'accès à ma question.
- La chose est d'obtenir votre script pour imprimer/log sys.chemin d'accès lorsque le script est exécuté par le serveur web. Si le
modules
dir n'est pas une partie desys.path
, puisimport layout
échouera. Notez que lemodules
dir n'est pas dans votresys.path
exemple.
Vous devez vous connecter pour publier un commentaire.
Premier essai:
Est-il chargé correctement?
Si oui, alors vous avez probablement certains de l'environnement (en
~/.bashrc
ou tel) qui est nécessaire pour votre application. Essayez::Assurez-vous d'utiliser les mêmes python dans votre shell que celui utilisé par apache WSGI.
Si votre
myapp.wsgi
besoin d'un env pour charger correctement, alors vous pouvez faire l'une des:À définir dans votre WSGI code, voici l'exemple de code.
Mis dans le début de votre myapp.wsgi fichier.
env -i
puis inspecter manuellement votre environnementenv
de commande de votre profil et de scripts. Utilisez-vous un virtualenv ou tel?python /usr/local/www/myapp/myapp.wsgi
?WSGIPythonPath /usr/local/www/myapp/modules
à votre configuration d'apachepython directory/wsgi.py
fixé mon problème. Semble comme une évidence.Vous avez
__init.__py
dans votrelayout
dossier, mais il devrait être__init__.py
. La période est mal placée. Je ne suis pas sûr si c'est une faute de frappe dans votre poste ou pas, mais si c'est ce que le fichier semble que ça peut provoquer ce problème.le répertoire des modules a aussi besoin d'un
__init__.py
fichier pour être défini comme un paquet.modules
n'est pas un paquet (basé sur indiquéPYTHONPATH
).J'ai eu un problème similaire et c'résolu:
Selon http://webpy.org/install#apachemodwsgi
Ça marche pour moi de façon spectaculaire.