Невозможно импортировать модуль - PullRequest
6 голосов
/ 20 января 2012

Я создал веб-приложение на python со следующей структурой каталогов:

# cd /usr/local/www/myapp

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

Я установил PYTHONPATH на:

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

В myapp.wsgi я пытаюсь сделать:

import layout

Но я получаю Внутреннюю ошибку сервера. Почему?

Это мой myapp.wsgi (если я удаляю строку разметки импорта, она работает):

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]

Я получаю полное сообщение об ошибке:

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.

Моя конфигурация виртуального хоста:

<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>

Ошибка из /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

Вывод print sys.path:

enter image description here

Ответы [ 5 ]

8 голосов
/ 20 января 2012

Первая попытка:

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

Правильно ли загружается?

Если да, то, возможно, у вас есть среда (в ~/.bashrc или около того), которая необходима для вашего приложения.Попробуйте ::

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

Убедитесь, что вы используете в своей оболочке тот же python, что и apache WSGI.

Если вашему myapp.wsgi для корректной загрузки необходим дополнительный env, то вы можетевыполните одно из следующих действий:

  • установите путь Python в Apache или
  • установите во время выполнения в myapp.wsgi

Чтобыв коде WSGI, вот пример кода.

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)

Вставьте в начало вашего файла myapp.wsgi.

1 голос
/ 20 января 2012

В вашей папке layout есть __init.__py, но она должна быть __init__.py.Период неуместен.Я не уверен, является ли это опечатка в вашем сообщении или нет, но если это то, как выглядит ваш файл, это может вызвать эту проблему.

0 голосов
/ 22 июня 2016

Согласно http://webpy.org/install#apachemodwsgi

Если в файле apache error.log вы получили «ImportError: модуль с именем web», вы можете попробовать задать абсолютный путь в code.py перед импортом web:

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

У меня это резко работает.

0 голосов
/ 01 ноября 2013

У меня была похожая проблема, и это решило ее:

chmod a+x myapp.wsgi
0 голосов
/ 20 января 2012
Для каталога

modules также требуется определить файл __init__.py как пакет.

...