与 Python 脚本远程交互的最简单方法

Simplest Way to Remotely Interact With Python Script

我正在网络上设置一个 Raspberri Pi,它 运行 是一个 Python 脚本来控制 GPIO 引脚。我需要通过 GUI 或命令行从网络上的另一台计算机更改此脚本中的变量。完成此操作的最简单方法是什么(我是新手)?

也许一个简单的网页以某种方式托管在 Pi 上,带有控制变量的按钮?

谢谢

编辑:抱歉,我只是想保持简单。该脚本将在启动时启动并 运行 持续监控温度,并循环加热器 on/off(通过 GPIO 引脚)以维持存储在 "set_point" 变量中的温度。

我建议您通过从另一台计算机通过 SSH 连接到您的 raspberry pi 来编辑 python 脚本中的变量,然后在基于终端的编辑器中编辑变量,例如 nanovim。执行此操作的方法如下:

第一

获取您raspberry pi的本地IP地址,并在同一网络的计算机上运行执行以下命令。例如:

$ ssh brian@10.0.1.164 

假设 raspberry pi 的 IP 地址为 10.0.1.164,并且 raspberry pi 也有一个名为 brian 的用户。如果您不知道 pi 的 IP 地址,请在 pi 上 运行 sudo ifconfig 并获取 wlan0 旁边的数字(如果您使用的是 wifi,该数字应以 10.0192.168).然后系统将提示您输入用户密码。

第二

通过 ssh 连接后,使用 nanovim(基于命令行的文本编辑器)打开您想要的 python 文件:

nano /users/brian/Documents/python-project/myfile.py

其中 /users/brian/Documents/python-project/myfile.py 是文件在 raspberry pi 上的位置。

这是最简单的入门方法,当然您可以构建更复杂的 Web 应用程序来以某种方式完成此操作,但最好从快速简单的方法开始。

实际上,您可能希望在每次脚本 运行 时检查变量的新值 - 因此请将其保存在远程计算机上可访问的位置。
例如 - 1) 如果您在共享文件夹中的文件中共享它: 使用来自 raspberry-pi 的 python 脚本读取远程计算机上的文件并获取变量值。
2)如果您在远程计算机上有网络服务器 - 即您发出请求并获取变量值作为响应。 使用以下 python 代码:

import requests

response = requests.post("http://remote-pc/varvalues",{"get_value_for_variable":'var-name'})
print(response.content)

您的问题所包含的信息非常少... 基于假设你有 python 脚本 remote.py 并且需要将值传递给变量, 您可以使用 python

中的 ssh 命令来完成
import os
os.system ('ssh remoteuser at remote python remote.py arg1 "arg 2 has spaces" 
arg3')

如果您想使用网络 API 电话,请参考以下内容 link, How to use Web APIs in pyton3

这是一个可以安装在 Raspberry Pi 上的小网页,在 Apache/other 网络服务器的文档根目录中另存为 index.php。然后,您可以使用任何 iPhone 或网络上的计算机控制所需的温度设置,方法是转到 URL:

<IP-ADDRESS-OF-PI>://index.php

看起来像这样:

显然,我不是酷炫网站的时尚设计师,所以需要 "tarting up" 才能好看 ;-)

在电影的底部,有一个小 Python 脚本 运行 - 在服务器上观看 "setting.txt" 文件(在你的例子中是 Raspberry Pi ):

from time import sleep
while True:
   file = open("setting.txt", "r") 
   print file.read() 
   file.close()
   sleep(1)

这是网页index.php:

<?php
// If we were POSTed, save the value in file on server
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
   file_put_contents("setting.txt",$_POST['val']);
   return;
}
?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Temperature Control</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>

<?php
   // Get setting from previous run and load into Javascript variable "setting"
   if(!file_exists("setting.txt")){
      $s=10;
   } else {
      $s = file_get_contents("setting.txt");
   }
   printf("var setting=%d;",$s);
?>

  $( function() {
    $( "#slider-vertical" ).slider({
      orientation: "vertical",
      range: "min",
      // Constrain temperature setting to range [10,30]
      min: 10,
      max: 30,
      value: setting,
      change: function( event, ui ) {
        $( "#amount" ).val( ui.value );
        // Send value of slider back to server via AJAX POST
        $.post("index.php",{val:ui.value});
      }
    });
    // Update numeric value displayed on webpage
    $( "#amount" ).val( $( "#slider-vertical" ).slider( "value" ) );
  } );
  </script>
</head>
<body>

<p>
  <label for="amount">Setting:</label>
  <input type="text" id="amount" readonly style="border:0; color:#f6931f; font-weight:bold;">
</p>

<div id="slider-vertical" style="height:200px;"></div>

</body>
</html>

每次滑块移动时,它都会执行 AJAX POST 返回服务器发送滑块的值以保存在名为 "setting.txt" 的文件中。这实际上是由同一个 PHP 接收的(您可以在前 4 行中看到),因此您只需要维护一个文件。

然后您的 Python 脚本可以每次通过其主循环读取该文件中设置的值,或者时不时地,或者当文件更改时 - 如您所愿。

这是另一种方法,使用 Redis,它非常快速、非常简单 "data structure server"。它可以提供字符串、整数、原子整数、列表、队列、散列、集合、有序集合等,并且有 C、C++、PHP、Python、命令行等的客户端。

因此,如果您在 Raspberry Pi 上安装 Redis,并使用 systemctl 启动它,您可以设置和获取值。所以,让我们 运行 一个 Python 每秒循环检查温度设置的脚本:

#!/usr/local/bin/python3

import redis
from time import sleep

# Connect to local Redis server
con = redis.Redis("localhost")

while True:
   print(con.get("setting"))
   sleep(1)

然后,在网络上的任何其他机器上,您可以使用命令行客户端为 setting 字符串设置一个值,例如:

redis-cli -h <IP-ADDRESS-OF-PI> <<< "SET setting 31"

这是它的动画。上半部分是 Raspberry Pi 上的控制程序 运行ning,每次通过其循环获取温度。下半部分是网络上的任何其他机器,只需在命令行设置所需的温度即可:

当然,您也可以通过其他方式传输数据 - 从 Pi 到网络客户端 - 通过将 Pi 上的实际测量温度存储在另一个变量 (SET actual 23) 中,并通过"GET actual".