无法导入模块

6 投票
5 回答
11479 浏览
提问于 2025-04-17 10:42

我创建了一个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

打印sys.path的输出结果:

在这里输入图片描述

5 个回答

0

模块目录里还需要一个 __init__.py 文件,这样才能被认定为一个包。

1

你的 layout 文件夹里有一个叫 __init.__py 的文件,但它应该叫 __init__.py。这里的点放错地方了。我不确定这是不是你发帖时的打字错误,但如果你的文件真是这样命名的,那就会导致这个问题。

8

第一次尝试:

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 文件需要额外的环境才能正确加载,你可以选择以下其中一种方法:

  • 在 Apache 中设置 Python 路径,或者
  • 在你的 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 文件的开头。

撰写回答