Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot import module

I have created a python web app with this directory structure:

# cd /usr/local/www/myapp

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

I have set my PYTHONPATH to:

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

In myapp.wsgi I try to do:

import layout

But I am getting Internal server error. Why?

This is my myapp.wsgi (if I remove the import layout line, it works):

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]

Full error message I am getting:

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.

My virtualhost configuration:

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

Error from /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

Output of print sys.path:

enter image description here

like image 978
Richard Knop Avatar asked Jan 20 '12 15:01

Richard Knop


People also ask

Why can't I import modules in Python?

This is caused by the fact that the version of Python you're running your script with is not configured to search for modules where you've installed them. This happens when you use the wrong installation of pip to install packages.

How do I import a module file?

A file is considered as a module in python. To use the module, you have to import it using the import keyword. The function or variables present inside the file can be used in another file by importing the module. This functionality is available in other languages, like typescript, JavaScript, java, ruby, etc.


2 Answers

First try:

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

Does it load correctly?

If yes, then probably you have some environment (in ~/.bashrc or such) which is needed for your app. Try::

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

Verify you use same python in your shell as the one used by apache WSGI.

If your myapp.wsgi need any extra env to load correctly, then you can do one of:

  • set python path in apache, or
  • set in runtime in your myapp.wsgi

To set in in your WSGI code, here is the example code.

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)

Put in in the beginning of your myapp.wsgi file.

like image 122
Michał Šrajer Avatar answered Oct 15 '22 02:10

Michał Šrajer


You have __init.__py in your layout folder, but it should be __init__.py. The period is misplaced. I am not sure if this is a typo in your post or not, but if that's what your file looks like it would cause this problem.

like image 20
aganders3 Avatar answered Oct 15 '22 00:10

aganders3