与 Python 脚本远程交互的最简单方法
Simplest Way to Remotely Interact With Python Script
我正在网络上设置一个 Raspberri Pi,它 运行 是一个 Python 脚本来控制 GPIO 引脚。我需要通过 GUI 或命令行从网络上的另一台计算机更改此脚本中的变量。完成此操作的最简单方法是什么(我是新手)?
也许一个简单的网页以某种方式托管在 Pi 上,带有控制变量的按钮?
谢谢
编辑:抱歉,我只是想保持简单。该脚本将在启动时启动并 运行 持续监控温度,并循环加热器 on/off(通过 GPIO 引脚)以维持存储在 "set_point" 变量中的温度。
我建议您通过从另一台计算机通过 SSH 连接到您的 raspberry pi 来编辑 python 脚本中的变量,然后在基于终端的编辑器中编辑变量,例如 nano
或 vim
。执行此操作的方法如下:
第一
获取您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.0
或 192.168
).然后系统将提示您输入用户密码。
第二
通过 ssh 连接后,使用 nano
或 vim
(基于命令行的文本编辑器)打开您想要的 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"
.
我正在网络上设置一个 Raspberri Pi,它 运行 是一个 Python 脚本来控制 GPIO 引脚。我需要通过 GUI 或命令行从网络上的另一台计算机更改此脚本中的变量。完成此操作的最简单方法是什么(我是新手)?
也许一个简单的网页以某种方式托管在 Pi 上,带有控制变量的按钮?
谢谢
编辑:抱歉,我只是想保持简单。该脚本将在启动时启动并 运行 持续监控温度,并循环加热器 on/off(通过 GPIO 引脚)以维持存储在 "set_point" 变量中的温度。
我建议您通过从另一台计算机通过 SSH 连接到您的 raspberry pi 来编辑 python 脚本中的变量,然后在基于终端的编辑器中编辑变量,例如 nano
或 vim
。执行此操作的方法如下:
第一
获取您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.0
或 192.168
).然后系统将提示您输入用户密码。
第二
通过 ssh 连接后,使用 nano
或 vim
(基于命令行的文本编辑器)打开您想要的 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"
.