使用Mod_wsgi+Apache+Bottle.py时无法导入模块“server”求助
ImportError: No module named server问题 我之前在部署Bottle应用到mod_wsgi时也碰到过几乎一模一样的问题,大概率是模块路径或命名冲突导致的,咱们一步步来排查:
1. 先排查模块命名冲突
如果你的自定义模块文件名叫server.py,那很可能和Bottle内部的server模块(或者系统自带的同名模块)重名了!mod_wsgi在导入时会优先找到系统/第三方库的同名模块,而不是你的自定义文件。
解决办法:把你的server.py改个独特的名字,比如my_api_server.py,然后把app.wsgi里的导入语句改成import my_api_server,重启Apache再测试。
2. 确认WSGIPythonPath配置是否生效
你提到已经配置了WSGIPythonPath,但大概率是路径没写对或者没重启服务。要确保把包含你的server模块的目录的绝对路径加进去:
比如你的server.py放在/var/www/myapi目录下,Apache配置里应该这么写:
# 全局配置方式 WSGIPythonPath /var/www/myapi # 或者用守护进程指定(更推荐,隔离不同应用) WSGIDaemonProcess myapi python-path=/var/www/myapi WSGIProcessGroup myapi
改完配置一定要重启Apache(比如sudo systemctl restart apache2),不然配置不会生效。
3. 检查mod_wsgi绑定的Python版本
很多时候系统里会装多个Python版本,mod_wsgi可能绑定的不是你开发时用的那个版本,导致你的模块不在它的查找路径里。
可以在你的app.wsgi里加几行调试代码:
import sys # 把当前Python的路径和版本打印到Apache错误日志 print(f"Python version: {sys.version}") print(f"Python path: {sys.path}")
然后查看Apache的错误日志(一般在/var/log/apache2/error.log),看看输出的路径里有没有你的模块所在目录,以及Python版本是不是你预期的。如果版本不对,需要重新编译mod_wsgi来匹配你的目标Python版本。
4. 检查文件权限
Apache的运行用户(通常是www-data)需要有读取你的server.py文件的权限,以及访问该文件所在目录的权限。可以用以下命令检查:
ls -l /var/www/myapi/server.py
如果权限不对,临时调整试试:
chmod o+r /var/www/myapi/server.py chmod o+x /var/www/myapi
5. 尝试绝对导入
如果你的应用是一个包结构,试试用相对或绝对导入的方式。比如app.wsgi和server.py在同一目录下,可以改成:
from . import server
如果上级目录是一个Python包(有__init__.py),可以用:
from myapi import server
内容的提问来源于stack exchange,提问作者Jeanette Pranin

