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

时间:2017-12-21 06:17:13

标签: python python-3.x raspberry-pi remote-access

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

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

由于

编辑:对不起,我试图保持简单。脚本将在启动时启动并连续运行,监控温度,打开/关闭加热器(通过GPIO引脚)以保持温度存储在" set_point"变量

5 个答案:

答案 0 :(得分:3)

您的问题信息非常少...... 根据假设您有python脚本remote.py并需要将值传递给变量, 你可以在python

中使用ssh命令来完成
<Application.Resources>
    <Style TargetType="Button">
        <Setter Property="Margin" Value="10"/>
        <Setter Property="Width" Value="200"/>
        <Setter Property="Height" Value="25"/>
    </Style>
    <Style TargetType="Ellipse">
        <Setter Property=""
    </Style>
</Application.Resources>

如果您想使用Web API调用,请参阅以下链接, How to use Web APIs in pyton3

答案 1 :(得分:2)

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

import requests

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

答案 2 :(得分:1)

我建议你通过从另一台计算机SSH连接到raspberry pi然后在基于终端的编辑器(如nanovim)中编辑变量来编辑python脚本中的变量。这是你如何做到这一点:

<强>第一

获取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是树莓派上文件的位置。

这是最简单的入门方式,当然你可以构建一个更复杂的网络应用来实现这个目标,但最好从快速简单的方式开始。

答案 3 :(得分:1)

以下是您可以在Raspberry Pi上安装的小网页,在{/ 1}}中保存在Apache /其他Web服务器的文档根目录中。然后,您可以使用网络上的任何iPhone或计算机控制所需的温度设置,方法是转到URL:

index.php

看起来像这样:

enter image description here

显然,我不是一个看起来很酷的网站的时尚设计师,所以它需要&#34; tarting up&#34; 看起来不错; - )

在电影的底部,有一个小的Python脚本在运行 - 观看服务器上的<IP-ADDRESS-OF-PI>://index.php 文件(在你的情况下在Raspberry Pi上):

"setting.txt"

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

index.php

每次滑块移动时,它会向服务器发送一个AJAX POST,发送滑块的值以保存在名为<?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> 的文件中。这实际上是由同一个PHP接收的(你可以在前4行看到),这样你只需要维护一个文件。

然后,您的Python脚本每次都可以通过主循环读取该文件中的值集,或者偶尔读取该文件中的值集,或者当文件发生变化时 - 如您所愿。

答案 4 :(得分:0)

这是另一种方式,使用Redis,这是一个非常快速,非常简单的“数据结构服务器”。它可以提供字符串,整数,原子整数,列表,队列,散列,集合,排序集等,还有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上运行的控制程序,每次循环都会得到温度。下半部分是网络上的任何其他机器,只需在命令行设置所需的温度:

enter image description here

当然,你也可以通过另一种方式 - 从Pi到网络客户端 - 传输数据,将Pi上的实际测量温度存储在另一个变量(SET actual 23)中,然后通过{{{ 1}}。