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

如何从PHP向Python3传递数值变量以控制LED开关及时长

解决PHP传递数值参数给Python脚本控制LED的问题

嘿,我之前做过类似的硬件控制项目,你的需求完全可行!把多个重复的Python脚本合并成一个通用版,通过PHP传递LED编号和时长参数就行,咱们一步步来捋清楚:

第一步:改造Python脚本,接收命令行参数

原来的重复脚本可以改成从命令行获取参数,Python里用sys.argv就能拿到,注意这里拿到的都是字符串,得转成数值类型(LED编号是整数,时长可以是整数或浮点数)。

举个实际可用的例子,命名为control_led.py:

import sys
import RPi.GPIO as GPIO
import time

# 初始化GPIO配置
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

try:
    # 从命令行取参数:sys.argv[0]是脚本名,[1]是LED引脚号,[2]是点亮时长
    led_pin = int(sys.argv[1])
    duration = float(sys.argv[2])

    # 设置引脚为输出模式
    GPIO.setup(led_pin, GPIO.OUT)
    # 点亮LED
    GPIO.output(led_pin, GPIO.HIGH)
    # 保持指定时长
    time.sleep(duration)
    # 熄灭LED
    GPIO.output(led_pin, GPIO.LOW)
finally:
    # 不管有没有出错,都要清理GPIO状态,避免硬件异常
    GPIO.cleanup()

第二步:PHP端传递参数并调用Python脚本

PHP里用exec()或者shell_exec()调用Python脚本就行,但一定要注意参数转义,防止命令注入风险,用escapeshellarg()处理每个参数就很安全。

给你写个完整的PHP示例:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 从表单获取LED编号和时长(对应按钮的隐藏字段)
    $ledPin = $_POST['led_pin'];
    $duration = $_POST['duration'];

    // 转义参数,避免恶意命令注入
    $safeLedPin = escapeshellarg($ledPin);
    $safeDuration = escapeshellarg($duration);

    // 调用Python脚本,注意要用绝对路径(python3和脚本的路径都要写全)
    $command = "/usr/bin/python3 /home/pi/your_project/control_led.py {$safeLedPin} {$safeDuration}";
    exec($command, $output, $returnVar);

    // 根据返回值判断执行结果
    if ($returnVar === 0) {
        echo "LED {$ledPin} 已成功点亮 {$duration} 秒";
    } else {
        echo "执行出错啦!错误信息:" . implode("\n", $output);
    }
}
?>

<!-- 网页按钮部分,比如两个按钮分别控制不同LED和时长 -->
<form method="post">
    <button type="submit">点亮LED1(引脚18,亮2秒)</button>
    <input type="hidden" name="led_pin" value="18">
    <input type="hidden" name="duration" value="2">
</form>
<form method="post">
    <button type="submit">点亮LED2(引脚23,亮3.5秒)</button>
    <input type="hidden" name="led_pin" value="23">
    <input type="hidden" name="duration" value="3.5">
</form>

第三步:这些坑一定要注意!

  • 权限问题:网页运行的用户(一般是www-data)需要有权限控制GPIO。执行这条命令把它加入gpio组:sudo usermod -a -G gpio www-data,然后重启web服务器(比如sudo systemctl restart apache2)。
  • 参数类型转换:PHP传过来的参数是字符串,Python里必须转成int或float,不然time.sleep()会直接报错。
  • 绝对路径:调用Python脚本时必须写全路径,不然web服务器可能找不到脚本位置。
  • 调试技巧:如果执行失败,用exec()的$output参数可以获取Python脚本的错误输出,方便排查问题。

先单独测试再上线

先在终端手动运行Python脚本测试:python3 control_led.py 18 2,确认LED能正常点亮熄灭,再点网页按钮测试,基本就没问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:16:20