将模块加载到Apache + mod-wsgi中

5 投票
3 回答
6465 浏览
提问于 2025-04-16 06:58

我正在使用Apache和mod-wsgi。

在我的httpd.conf文件的最后,我添加了以下几行。

LoadModule wsgi_module modules/mod_wsgi-win32-ap22py27-3.3.so
WSGIScriptAlias / "C:/Projects/Folder/web/"
<Directory "C:/Projects/Folder/web">
AllowOverride None
Options None
Order deny,allow
Allow from all
</Directory>

当我在Windows上通过http://localhost/script/index.py执行以下index.py脚本时,

def application(environ, start_response):
    status = '200 OK' 
    output = 'Hello World!'
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

一切运行得很好。

但是,当我在index.py的第一行添加import utils时,我遇到了问题。

ImportError: No module named utils

utils.pyindex.py在同一个文件夹里。

我需要设置其他的配置吗?

我尝试了@dan_waterworth给的建议。

import sys, os
sys.path.append(os.path.dirname(__file__))

导入我自己的模块时没有再出现错误。但是,当我导入通过easy_install安装的模块时,就会出错。

   File "C:/Projects/Folder/web/script\\connection.py", line 1, in <module>
     import psycopg2
   File "build\\bdist.win32\\egg\\psycopg2\\__init__.py", line 65, in <module>
     from psycopg2 import tz
 ImportError: cannot import name tz

如果这个脚本作为独立应用程序执行,import psycopg2是没有问题的。

3 个回答

0

你可以用 sys.pathsys.modules 来检查某个目录是否真的被添加为模块目录。如果没有的话,就用 sys.path.append 把它加上去。

1

其他的回答主要是让脚本自己去搞定它的PYTHONPATH。还有一种方法是找出合适的Apache设置,这样就能为Python和WSGI应用程序建立一个可用的路径。

我在我的配置文件里有这些设置:

PassEnv PYTHONPATH
WSGIPythonHome  C:/Python/Python26
WSGIPythonPath  C:/Python/Python26;C:/myproject/PyLib

如果你不想传递你环境里的PYTHONPATH,我觉得你可以使用:

SetEnv PYTHONPATH C:/your/paths/go/here;C:/and/here

我建议你试试这些方法。

6

我发现我需要添加几行代码来把 Python 的路径加上去。大概是这样的:

import sys, os
sys.path.append(os.path.dirname(__file__))

import utils

对于第二部分,只需要为你的导入目录再加几行代码。比如:

sys.path.append([enter path here])

要找到你的导入目录,可以在一个交互式的 Python 提示符下输入:

import sys
print sys.path

撰写回答