在cPanel共享主机部署Flask应用时因passenger_wsgi.py依赖已废弃的imp模块导致失败的解决方法咨询
在cPanel共享主机部署Flask应用时因passenger_wsgi.py依赖已废弃的imp模块导致失败的解决方法咨询
嘿,我之前在cPanel部署Flask的时候也碰到过一模一样的问题——自动生成的passenger_wsgi.py硬用了已经被Python移除的imp模块,手动修改后还会被自动覆盖,真的挺头疼的。给你几个亲测有效的解决思路:
方案一:自定义WSGI入口文件,避开自动生成覆盖
这是最稳妥的办法,步骤如下:
- 在你的Flask应用根目录下,手动创建一个新的WSGI文件,比如命名为
custom_wsgi.py - 把原来
passenger_wsgi.py里的内容替换成importlib兼容的写法,示例代码如下:
import importlib.util # 替换成你实际的Flask入口文件(比如app.py或者wsgi.py) spec = importlib.util.spec_from_file_location('wsgi', 'app.py') wsgi = importlib.util.module_from_spec(spec) spec.loader.exec_module(wsgi) # 替换成你Flask应用的实例名(通常是app或者application) application = wsgi.app
- 打开cPanel里的「Setup Python App」工具,找到你正在部署的Flask应用,点击「Edit」进入编辑界面
- 在「WSGI Application file」字段里,把默认的
passenger_wsgi.py改成你刚创建的custom_wsgi.py,保存设置
这样cPanel就不会再自动生成覆盖这个文件,你的应用会使用自定义的兼容版WSGI文件启动。
方案二:联系主机服务商更新模板
如果你的主机服务商的cPanel Python应用模板还没更新到使用importlib,可以直接联系他们的技术支持,说明passenger_wsgi.py模板里的imp模块在高版本Python中已被移除,请求他们更新模板代码。很多服务商都会及时处理这类兼容性问题。
方案三:临时兼容层(不推荐作为长期方案)
如果以上两种方法暂时无法实施,可以尝试在你的Flask入口文件(比如app.py)顶部添加一个兼容层,临时模拟imp模块的功能:
try: import imp except ImportError: import importlib.util class ImpCompatibility: @staticmethod def load_source(module_name, file_path): spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module imp = ImpCompatibility()
这个方法只是临时绕开错误,可能会有潜在的兼容性问题,所以优先推荐前两个方案。
备注:内容来源于stack exchange,提问作者macloo
相关产品推荐
相关产品推荐

