2012-01-20 299 views
6

我创建了这个目录结构的蟒蛇网络应用:无法导入模块

# 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, [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. 

我的虚拟主机配置:

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

错误来自/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的:

enter image description here

+1

至少包含您正在收到的完整且准确的错误消息。 – unwind

+0

你如何运行网络服务器?这很可能不会使用您的环境,因此为您自己的shell设置PYTHONPATH将无济于事。 – geoffspear

+0

我使用Apache mod_wsgi,并为/ usr/local/www/myapp创建了一个虚拟主机。 –

回答

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 

验证您的shell中使用的是与Apache WSGI使用的python相同的python。

如果您myapp.wsgi需要任何额外的ENV正确加载,那么你可以做的一个:

  • 设置python path在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文件的开头。

+0

我尝试了所有这些。没有工作。 env -i bash不起作用,因为我使用的是FreeBSD。 –

+0

如果您不能执行'env -i',则手动检查您的环境'env'命令和您的配置文件脚本。你使用virtualenv还是这样的? –

+0

'python/usr/local/www/myapp/myapp.wsgi'的输出是什么? –

1

你有__init.__pylayout文件夹,但它应该是__init__.py。这个时期是错位的。我不确定这是否是您的文章中的拼写错误,但如果这是您的文件看起来会导致此问题。

+0

这只是一个错字。抱歉。 –

0

模块目录还需要一个__init__.py文件被定义为一个包。

+1

'modules'不是一个包(根据指定的'PYTHONPATH')。 – jrennie

0

我也有类似的问题,这解决了它:

chmod a+x myapp.wsgi 
0

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

它极大地为我工作。