Web界面中PHP无法执行Python脚本生成CSV文件的求助
解决PHP无法调用Python脚本生成CSV的问题
问题分析
核心问题是PHP通过shell_exec调用Python脚本失败,虽然脚本单独运行正常,但Web环境下存在参数传递错误、环境路径差异、权限限制三类常见问题,下面逐一排查解决:
1. 修复Python脚本的参数接收逻辑
你的Python脚本未正确接收PHP传递的日期参数,导致文件名错误且无法生成预期文件。修改mediciones.py:
import serial import csv import sys # 检查是否传入日期参数 if len(sys.argv) < 2: print("错误:缺少日期参数") sys.exit(1) # 接收PHP传递的日期参数 fecha_actual = sys.argv[1] csv_file = f"{fecha_actual}.csv" i = 0 try: ser = serial.Serial('/dev/ttyACM0', 115200) with open(csv_file, 'w', newline='\n') as file: writer = csv.writer(file) while i < 500: try: raw = ser.readline().decode().strip() values = raw.split(',') writer.writerow([values[0], values[1]]) i += 1 except Exception as e: print(f'读取数据错误: {e}') break ser.close() print(f"文件 {csv_file} 生成成功,共写入 {i} 条数据") except Exception as e: print(f"初始化失败: {e}")
2. 修正PHP的执行命令
2.1 明确Python路径
树莓派默认python指向Python2,而你的脚本依赖Python3的serial模块,必须用python3调用。先在终端执行which python3获取绝对路径(比如/usr/bin/python3),替换到PHP代码中。
2.2 使用绝对路径调用脚本
避免相对路径找不到脚本,直接写入Python脚本的绝对路径(比如/var/www/html/mediciones.py)。
2.3 捕获错误输出
shell_exec默认只返回标准输出,重定向错误输出到标准输出,方便排查问题。
修改crear_csv.php中的执行代码:
<?php if(isset($_POST['crear_csv'])) { $fecha_actual = date("Y-m-d"); // 替换为你的Python3绝对路径和脚本绝对路径 $python_path = "/usr/bin/python3"; $script_path = "/var/www/html/mediciones.py"; // 执行命令并捕获所有输出(包括错误) $output = shell_exec("$python_path $script_path $fecha_actual 2>&1"); echo "<pre>$output</pre>"; } ?>
3. 解决权限问题
Web服务器用户(通常是www-data)默认没有串口访问权限和文件写入权限:
3.1 给www-data添加串口权限
终端执行:
sudo usermod -a -G dialout www-data
3.2 确保Web目录可写入
给网站根目录添加写入权限:
sudo chown www-data:www-data /var/www/html sudo chmod 755 /var/www/html
3.3 重启Web服务器
使权限生效:
# Apache用户执行 sudo systemctl restart apache2 # Nginx用户执行 sudo systemctl restart nginx
4. 测试验证
- 点击界面按钮,查看PHP输出的内容,若有错误信息可针对性排查。
- 检查Web目录下是否生成了以当日日期命名的CSV文件。
- 若仍有问题,可先在PHP中执行
echo shell_exec("whoami");确认当前用户是否为www-data,再执行echo shell_exec("$python_path --version");确认Python版本是否正确。
内容的提问来源于stack exchange,提问作者imj
相关产品推荐
相关产品推荐

