You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户访问网站时Python程序无法加载的问题求助

解决你的Flask部署问题

首先得说,你现在用PHP exec()启动Flask的方式有几个关键问题,导致应用没正常跑起来:


为什么当前方法失效?

  • 每个exec()都是独立进程:你写的每一行exec()都是单独启动一个子进程,所以cd ~、source teamingit/bin/activate这些操作只在各自的进程里生效,完全不会影响后续的python __init__.py命令。比如激活虚拟环境的操作,只在那个exec('source ...')的进程里有用,下一行的python还是用的系统默认版本,不是虚拟环境里的。
  • Flask默认只绑定本地地址:即使你成功启动了Flask,它默认会跑在127.0.0.1:5000,这个地址只有服务器本地能访问,外部浏览器根本连不上。
  • PHP启动的进程不稳定:虚拟主机的web服务器(比如Apache/Nginx)会管理PHP进程,用exec()启动的Flask进程很容易被系统杀死,或者因为超时终止,根本没法长期运行。

正确的部署方案(生产环境推荐)

虚拟主机部署Flask最靠谱的方式是用WSGI协议,比如配合Apache的mod_wsgi(大部分虚拟主机都支持),步骤如下:

  1. 创建WSGI入口文件
    在你的public_html目录下新建app.wsgi,内容如下(替换yourusername为你的服务器用户名):
import sys
import os

# 激活虚拟环境(Python 2.7用execfile)
activate_this = os.path.expanduser("/home/yourusername/teamingit/bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))

# 把项目目录加入Python路径
sys.path.insert(0, os.path.expanduser("/home/yourusername/public_html"))

# 导入你的Flask应用(注意__init__.py里的app对象要叫application,或者这里改名字)
from __init__ import app as application
  1. 配置Apache的.htaccess文件
    同样在public_html目录下新建或修改.htaccess,告诉Apache用WSGI运行你的应用:
# 定义WSGI守护进程,指定虚拟环境的Python路径
WSGIDaemonProcess myapp python-path=/home/yourusername/teamingit/lib/python2.7/site-packages:/home/yourusername/public_html
WSGIProcessGroup myapp
# 把根路径映射到你的wsgi文件
WSGIScriptAlias / /home/yourusername/public_html/app.wsgi

# 授权访问项目目录
<Directory /home/yourusername/public_html>
    Require all granted
</Directory>
  1. 调整Flask应用的启动代码
    打开你的__init__.py,确保app.run()只在命令行运行时才执行,避免WSGI服务器重复启动开发服务器:
from flask import Flask
app = Flask(__name__)

# 你的路由、数据库操作等代码...

# 只有直接运行这个文件时才启动开发服务器
if __name__ == '__main__':
    app.run(host='0.0.0.0')

做完这些,重启Apache(如果虚拟主机允许的话,或者等服务器自动加载配置),访问你的域名就能看到Flask应用了。


临时测试方案(不推荐生产环境)

如果只是想临时验证应用能跑,你可以把所有命令合并成一个exec(),确保环境和路径正确,同时让Flask绑定公网地址:

<?php
// 替换yourusername为你的服务器用户名,端口选虚拟主机允许的(比如8080)
$command = "/bin/bash -c 'cd /home/yourusername/public_html && source /home/yourusername/teamingit/bin/activate && python __init__.py --host=0.0.0.0 --port=8080 > flask.log 2>&1 &'";
echo exec($command);
?>

然后访问http://你的域名:8080就能看到应用,但这个方法只能临时用,进程很容易被杀死,不适合长期运行。


内容的提问来源于stack exchange,提问作者Glenn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:10